1

这有助于在 Tcl 中,“一切都是字符串”。但话又说回来,它并不完全是 100% 完全一样的(因此有闪光效果)。我的问题是:假设我在列表中具有以下值:

list "12" 14 2a "1a"

我的期望是,如果“一切都是字符串”,那么为所有 4 个元素分配的内存应该是相同的(根据规范/预期行为),因为我们正在查看长度为 2 的 4 个字符串实例。
这是正确的假设?

4

1 回答 1

1

这些值可能会以字符串开始(由于文字共享的可能性,并不完全确定会发生这种情况)。让我们仔细看看(如果您自己执行此操作,则该tcl::unsupported::representation命令仅在 8.6 中,并且从不修改正在查看的对象;我;format x在第一行放了一个以确保我们不会得到任何意外转换)。

% set value [list "12" 14 2a "1a"];format x
x
% tcl::unsupported::representation [lindex $value 0]
value is a pure string with a refcount of 2, object pointer at 0x100874070, string representation "12"
% tcl::unsupported::representation [lindex $value 1]
value is a pure string with a refcount of 2, object pointer at 0x1008741c0, string representation "14"
% tcl::unsupported::representation [lindex $value 2]
value is a pure string with a refcount of 2, object pointer at 0x100874c40, string representation "2a"
% tcl::unsupported::representation [lindex $value 3]
value is a pure string with a refcount of 2, object pointer at 0x1008743d0, string representation "1a"
% tcl::unsupported::representation $value
value is a list with a refcount of 4, object pointer at 0x100874910, internal representation 0x1008eb050:0x0, string representation "12 14 2a 1a"

所以是的,这些值几乎相同。它们中的任何一个都没有内部表示,每个使用的字符串表示是一个分配为 3 个字节长的缓冲区(每个字符一个,一个用于终止 NUL 字节)。然而,列表本身有一个字符串表示(以及它的内部列表代表),尽管没有被要求提供;那是因为您使用的是文字列表,而 Tcl 的编译器将其优化为单个文字,因为这通常是正确的做法。

于 2017-01-27T11:13:34.970 回答