ソースコードに文字列リテラルを書くときは、L”…”のように、プレフィックスLをつけよう。
元ネタは「IDE Regex Replace: char to wchar_t string literals」。
次のコードのようにプレフィックスLをつけない場合、
UnicodeString text = "text";
MultiByteToWideChar APIが呼ばれ、文字列をワイド文字列に変換する処理が入る。
そこで、プレフィックスLをつけて、
UnicodeString text = L"text";
とすることで、直接メモリーにコピーされる。
質問させてください。
文字列リテラルの場合、上記のようにLマクロをつけるということですが、「文字列」の場合も同様でしょうか?
たとえば、String str = Label1->Text + ‘,’ + Label2->Textの場合の’,’もL’,’にする方がメモリコピーの観点からいいのでしょうか?
C++Builder XE3でソースコードを確認したところ
‘,’の場合に呼ばれるコンストラクタは、
__fastcall UnicodeString(char src): Data(0) { sprintf(L”%c”, src);}
L’,’の場合に呼ばれるコンストラクタは、
__fastcall UnicodeString(wchar_t src): Data(0) { SetLength(1)[1] = src; }
でした。
どちらの処理の方が効率がいいか、という話になります。
おそらくL’,’の方が効率がいいと思います。
(バージョンによって実装が異なる可能性があります。)
山本隆様
ご回答ありがとうございます。今後は、L’,’でいこうと思います。
ソースコードで処理の違いを追うことができる、というのも勉強になりました。