在Forth,S"......"的生命是什么时候?

har*_*ald 6 memory-management forth

我一直试图阅读这个,但我找不到任何提及它.

根据标准,创建的字符串S"无法修改,并且从Gforth的简单实验中可以明显看出字符串的空间不是来自字典或填充区域:

hex 
here . 7F48AB3B8758  ok
pad . 7F48AB3B8808  ok
s" test" .s <2> 77FDD0 4  ok
Run Code Online (Sandbox Code Playgroud)

我可以期待该地址有效多长时间?

换句话说,如果我将这个地址(和计数)存储在一个变量中,我可以稍后在程序中再参考它,还是需要将它移动到字典或堆中的单独位置?如果我不存储地址,我会泄漏内存吗?

Ash*_*eyF 7

编译成定义时,字符串的生命周期是定义的生命周期.s"通常仅在编译时使用.

并非所有Forths都允许使用解释时间s",实际上ANS说,"这个词的解释语义是不确定的." 行为将至少特定于您的特定Forth.

您似乎正在使用Gforth,恰好有至少一个解释时字符串的保留空间.Gforth手册说,"......字符串只存在下一次​​调用之前s"".它继续说,"有些Forth系统保留了不止一个这样的字符串,但通常它们的寿命有限." (第3.24节字符和字符串).

我希望有所帮助!

  • 你是对的,尽管在 gForth 中“至少一个解释时间字符串”实际上意味着你想要的数量。在 gForth 中,`S"` 在解释时分配内存,复制字符串,并且从不释放它(可以用于解释)。我通过输入 `see s"` 然后输入 `see save-mem` 发现了这一点。 (2认同)