postscript 堆栈溢出在 mac 和 linux 上不同并且受字体设置影响
postscript stack overflow differing on mac and linux and effected by font setting
为了解释我的问题,我将首先提供一些代码并解释它的作用:
% 1 1 65532{}for % cut off on mac with font set
% 1 1 99996{}for % cut off on mac without font set
% 1 1 300048{}for % cut off on linux with font set
% 1 1 300368{}for % cut off on linux without font set
% /Times-Roman findfont 10 scalefont setfont
showpage
当我取消注释第 1 行和第 6 行以及 运行 我的 mac 上的这个 postscript 程序时,我得到了堆栈溢出,但是如果我将 65532 替换为任何较小的整数。如果我改为取消注释第 2 行,那么我会再次出现堆栈溢出,但如果我用任何更小的整数替换 99996 则不会。第 3 行和第 4 行类似,除了 linux.
由此我得出以下结论:后记堆栈 mac 的长度为 99998(for 循环之前的 3 个数字和 for 循环创建的 99996 个数字给出了 99999 个数字,但这太多了,所以堆栈应为 99998 长)。同样,我得出的结论是 linux 堆栈的长度为 300370。让我知道这些推理是否不正确。另外,为什么它们不同?
接下来,我得出结论,设置字体在 mac 上占用堆栈中的 34464 项,但在 linux 上仅占用 320 项。再次提醒,如果其中有任何不正确的地方,请告诉我。
首先,我觉得设置字体竟然要占用这么多 space,这对我来说似乎很奇怪,其次为什么它们在 mac 和 linux 上差异如此之大(超过space mac 的 100 倍)?
最后,我想知道除了程序员定义的操作之外,postscript 中是否还有其他操作在堆栈上占用大量space。我认为堆栈中的项目数量超过 100 个。
谢谢
PLRM 附录中有关实施限制的详细信息是了解此领域的好地方。级别 1 中操作数堆栈的典型大小约为 1000。在级别 2(及更高级别)中,堆栈将增长以容纳新对象,但 Postscript 并不真正适合在堆栈中放置如此多的对象。
字体作为字典对象实现,因此它们不会在堆栈上占用 space,但它们会占用 PostScript 虚拟内存中的内存。在堆栈本身上,它只占用 space 个对象。
有一些运算符可以将许多对象添加到堆栈中。任何类型的循环(如您已经发现的 for
)都可以将对象添加到堆栈中。 aload
是另一个,因为它将数组的内容溢出到堆栈上。
实际上,堆栈大小限制应该不是问题。如果你有很多数据,那么它真的应该存储在数据结构中,比如数组、字符串和字典。在大多数情况下,您可能会想将大量数据放在堆栈上,但都可以重写以减轻堆栈负担。
PostScript 设计的很大一部分是使其在内存使用方面非常轻便,适合它擅长的任务。例如,级别 1 中的 image
运算符采用 数据获取过程 而不是数组或字符串。通常的使用方法是在源文件中预读程序
找到它的样本。可以显示大图像,而无需一次将所有样本存储在内存中。数据采集程序可以使用一个小的字符串缓冲区来读取样本,然后 return 逐个读取它们。
为了解释我的问题,我将首先提供一些代码并解释它的作用:
% 1 1 65532{}for % cut off on mac with font set
% 1 1 99996{}for % cut off on mac without font set
% 1 1 300048{}for % cut off on linux with font set
% 1 1 300368{}for % cut off on linux without font set
% /Times-Roman findfont 10 scalefont setfont
showpage
当我取消注释第 1 行和第 6 行以及 运行 我的 mac 上的这个 postscript 程序时,我得到了堆栈溢出,但是如果我将 65532 替换为任何较小的整数。如果我改为取消注释第 2 行,那么我会再次出现堆栈溢出,但如果我用任何更小的整数替换 99996 则不会。第 3 行和第 4 行类似,除了 linux.
由此我得出以下结论:后记堆栈 mac 的长度为 99998(for 循环之前的 3 个数字和 for 循环创建的 99996 个数字给出了 99999 个数字,但这太多了,所以堆栈应为 99998 长)。同样,我得出的结论是 linux 堆栈的长度为 300370。让我知道这些推理是否不正确。另外,为什么它们不同?
接下来,我得出结论,设置字体在 mac 上占用堆栈中的 34464 项,但在 linux 上仅占用 320 项。再次提醒,如果其中有任何不正确的地方,请告诉我。
首先,我觉得设置字体竟然要占用这么多 space,这对我来说似乎很奇怪,其次为什么它们在 mac 和 linux 上差异如此之大(超过space mac 的 100 倍)?
最后,我想知道除了程序员定义的操作之外,postscript 中是否还有其他操作在堆栈上占用大量space。我认为堆栈中的项目数量超过 100 个。
谢谢
PLRM 附录中有关实施限制的详细信息是了解此领域的好地方。级别 1 中操作数堆栈的典型大小约为 1000。在级别 2(及更高级别)中,堆栈将增长以容纳新对象,但 Postscript 并不真正适合在堆栈中放置如此多的对象。
字体作为字典对象实现,因此它们不会在堆栈上占用 space,但它们会占用 PostScript 虚拟内存中的内存。在堆栈本身上,它只占用 space 个对象。
有一些运算符可以将许多对象添加到堆栈中。任何类型的循环(如您已经发现的 for
)都可以将对象添加到堆栈中。 aload
是另一个,因为它将数组的内容溢出到堆栈上。
实际上,堆栈大小限制应该不是问题。如果你有很多数据,那么它真的应该存储在数据结构中,比如数组、字符串和字典。在大多数情况下,您可能会想将大量数据放在堆栈上,但都可以重写以减轻堆栈负担。
PostScript 设计的很大一部分是使其在内存使用方面非常轻便,适合它擅长的任务。例如,级别 1 中的 image
运算符采用 数据获取过程 而不是数组或字符串。通常的使用方法是在源文件中预读程序
找到它的样本。可以显示大图像,而无需一次将所有样本存储在内存中。数据采集程序可以使用一个小的字符串缓冲区来读取样本,然后 return 逐个读取它们。