2017-01-27 13 views
1

Tclでは "すべてが文字列です"という助けになります。しかし、それとまったく同じ100%ではありません(したがって、きらめく効果)。次の値は、リストに、私たちは私が持っているとしましょう::数字のメモリフットプリントとTclの英数字の比較

list "12" 14 2a "1a" 

私の期待、「すべてが文字列である」場合には、すべての4つの要素に割り当てられたメモリは同一でなければならない、という私の質問はこれです(仕様/予想される動作によって)、長さが2の文字列の4つのインスタンスを見ているので、
正しい仮定ですか?

+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バイト長(各文字に1つ、終端NULバイトに1つ)に割り当てられたバッファです。しかし、リスト自体には、要求されていないにもかかわらず文字列表現(内部リスト担当者と同様)があります。これは、リテラルのリストを使用しているためで、Tclのコンパイラは、それを通常は正しいものとして1つのリテラルに最適化します。

+1

数値が要求されると、内部表現も表示されます。 「小さな」整数の場合、それはTcl_Obj構造体に直接格納されるため、余分なストレージコストは発生しません。 –