Ожидаемый объем памяти чисел и буквенно-цифровых символов в Tcl
Это помогает, что в Tcl "все это строка". Но опять же, это не совсем на 100% точно так (отсюда эффект мерцания). У меня такой вопрос: допустим, в списке есть следующие значения:
list "12" 14 2a "1a"
Я ожидаю, что, если "все является строкой", память, выделенная для всех 4 элементов, должна быть идентичной (согласно спецификации / ожидаемому поведению), так как мы смотрим на 4 экземпляра строк, длина которых равна 2.
Это правильное предположение?
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 оптимизирует его до одного литерала, как правило, это правильно.