一文字の文字列は必ずinternされるように
しました。
さらに、小さい文字列は変数に埋め込む形にしました。
struct BASE{ enum{ SMALL_STRING_MAX = (sizeof(int_t) / sizeof(char_t)) }; struct SmallString{ char_t buf[SMALL_STRING_MAX]; }; int_t type_; union{ int_t value_; float_t fvalue_; Base* pvalue_; SmallString svalue_; }; };
Xtalからはもちろん、C++から使う場合でも、それが大きい文字列か、小さい文字列か、特に意識することなくプログラミングできます。
StringPtr small = "a"; // small変数自体に埋め込まれる StringPtr large = "large string"; printf("%s, %s\n", small->c_str(), large->c_str());
文字列にはもう一つ仕掛けを。
文字列同士の連結にRope*1のような*2実装を取り入れました。
ret: ""; 10000.times{ ret ~= "aaaaaaaaaaaaaaaaaaaaaa"; }
のようなコードを書いても、速度が激しく落ちないようになりました。