C++Builder2009以降でソースコードに文字列リテラルを書くときはプレフィックスLをつけよう

ソースコードに文字列リテラルを書くときは、L”…”のように、プレフィックスLをつけよう。

元ネタは「IDE Regex Replace: char to wchar_t string literals」。

次のコードのようにプレフィックスLをつけない場合、

UnicodeString text = "text";

MultiByteToWideChar APIが呼ばれ、文字列をワイド文字列に変換する処理が入る。

そこで、プレフィックスLをつけて、

UnicodeString text = L"text";

とすることで、直接メモリーにコピーされる。

コメント

  1. 質問させてください。
    文字列リテラルの場合、上記のようにLマクロをつけるということですが、「文字列」の場合も同様でしょうか?
    たとえば、String str = Label1->Text + ‘,’ + Label2->Textの場合の’,’もL’,’にする方がメモリコピーの観点からいいのでしょうか?

  2. 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’,’の方が効率がいいと思います。
    (バージョンによって実装が異なる可能性があります。)

  3. 山本隆様
    ご回答ありがとうございます。今後は、L’,’でいこうと思います。

    ソースコードで処理の違いを追うことができる、というのも勉強になりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください