![将内容存储在盒子寄存器中成本有多高?](https://linux22.com/image/238704/%E5%B0%86%E5%86%85%E5%AE%B9%E5%AD%98%E5%82%A8%E5%9C%A8%E7%9B%92%E5%AD%90%E5%AF%84%E5%AD%98%E5%99%A8%E4%B8%AD%E6%88%90%E6%9C%AC%E6%9C%89%E5%A4%9A%E9%AB%98%EF%BC%9F.png)
我想知道,将一些内容存储在一个框中,然后仅使用一次(或两次),在编译速度和其他方面(如内存等)的成本有多高。如果在文档中经常使用,这种差异是否毫无意义或意义重大?
我说的是
{\sbox\mybox{<some content>}% or \setbox\mybox\hbox{..}
<calculated something depended on the box dimension>
\box\mybox
% or:
% \usebox\mybox
}
\box
另外:使用和(需要复制框)之间有多大区别\usebox
?在某些情况下,我不能确定不再需要该框,并且\box
一般不能使用。
我正在编写几个类似于的宏\raisebox
,它们将其内容存储到一个框中,并允许用户使用宏和其他宏访问尺寸\height
。\width
在正常使用过程中,这些宏可能经常级联,并且每个宏只会重新保存内部宏的已保存框(\sbox\mybox{\sbox\mybox{..} .. \usebox\mybox} .. \usebox\mybox
)。所以我想知道我是否应该以某种方式编写这些宏,以便它们可以在这种情况下重用内部宏的框寄存器,或者这是否会有点过头?
答案1
也就是说,\copy\x
或\box\x
成本相同,前者对于内存来说效率较低,因为它不会释放寄存器,而当组结束时寄存器无论如何都会被清除。
必须注意盒子寄存器的一个特性:\setbox0=\hbox{x}{\box0}
导致盒子寄存器 0 为空,因为\box
会清除寄存器最新实例的内容,在这种情况下恰好位于上层。
正如马丁所说,
\begingroup
\setbox0=\copy0
<code>
\endgroup
创建一个本地副本\box0
,在组内人们可以做很多事情而\box0
不必担心上层的盒子寄存器。
如果我编译一个由 10000 个仅使用 \hbox 构建的盒子副本组成的文件,我会得到
real 0m0.524s
user 0m0.458s
sys 0m0.054s
如果我改说\setbox0=\hbox{...}\box0
,我会得到
real 0m0.529s
user 0m0.460s
sys 0m0.054s
没什么大差别。