...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

配列同士の比較演算(2)

この間のコードと大差ないんだけど.
文字列リテラルは,D2.0 では invariant になった.
そのため,文字の配列と考えるよりも,文字列全体でひとつのデータの塊だと考えた方がわかりやすい.
ただ,コンパイラによる最適化のことも考えないといけない.

import std.stdio;
import x;// public string x = "EXIT";
void main()
{
    string a = "EXIT";
    string b = "EXIT";
    string c = "EXIT".dup;
    writefln(a is b); // true
    writefln(a == b); // true
    writefln(a is c); // false
    writefln(a == c); // true
    
    writefln(a is x.x); // false
    writefln(a == x.x); // true
}

a is c が false なのに対して a is b は true だ.
a is b が true なのは,コンパイラの最適化によって,値が同じ文字列リテラルがバイナリの中で重ねて配置されていて,データの実体は同一だから.
(言語処理系の実装には詳しくないんだけどたぶんそういうことだろう.)


また,同じ値の文字列リテラルがモジュールをまたいで存在する場合にはどうなるのかやってみた.
流石にモジュールをまたぐと,同じ値の文字列でも別の実体を持つみたい.
ただ,そこまでは最適化してないだけで,処理系の実装によるのかもしれない.


文字列の比較には == を使った方がよくて,is を使うときは注意する必要がありそう.