Tcl中,"一切都是字符串"。但话又说回来,它并不是 100% 完全一样(因此有闪光效果)。我的问题是:假设我在列表中具有以下值:
list "12" 14 2a "1a"
我的期望是,如果"一切都是字符串",则分配给所有 4 个元素的内存应该是相同的(根据规范/预期行为),因为我们正在查看长度为 2 的 4 个字符串实例。
这是一个正确的假设吗?
这些值可能以字符串的形式开始(由于文字共享的可能性,并不完全确定这是否会发生)。让我们仔细看看(如果您自己执行此操作,则 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 的编译器将其优化为单个文字,因为这通常是正确的做法。