使用时的一个想法cvs
是通过重用字符串缓冲区来帮助垃圾收集器,例如
/s 5 string def
s 2 cvs %...
s 66 cvs %...
然而,当在循环中执行此类操作时,实际在缓冲区中找到的字符串是:
(-40.0)
(-30.0)
(-20.0)
(-10.0)
(0.0.0)
(10.00)
(20.00)
(30.00)
(40.00)
因此,当转换结束时,字符串似乎并未终止(在 GhostScript 9.26 中找到)。不幸的是,GhostScript 参考手册对于字符串是否会被终止有些沉默。
所以问题是:预期的行为是什么?
当尝试类似的事情时val str dup 2 0 put cvs
结果是(如图所示==
):
(-40.0)
(-30.0)
(-20.0)
(-10.0)
(0.0\0000)
(10.00)
(20.00)
(30.00)
(40.00)
那么,重新使用字符串缓冲区到底是一个坏主意吗?
更新1:
我发现放入堆栈的值是正确的,而缓冲区中的值则不正确:
val s1 cvs pop % leaves the wrong value in s1
val s1 cvs /s2 exch def % leaves the correct value in s2
Postscript 字符串不是 C 字符串。特别是,它们不是以 NUL 结尾的;相反,它们具有明确的长度,就像 Postscript 数组一样。字符串(或数组)一旦创建就无法修改其长度,但可以创建子字符串(或子数组)的视图(Postscript 术语中的“间隔”)。区间不是副本;它与底层字符串(数组)共享存储。
cvs
接受一个字符串(用作缓冲区)作为参数,用转换为字符串的值参数覆盖缓冲区的初始段,并且返回该段作为区间。 (参见 PLRM 第 568 页;我懒得重新输入它。)如果您不希望转换后的值末尾有垃圾,您将需要使用该返回值。 (但是只有当您不将底层缓冲区用于其他用途时,返回的值才有效。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)