# 日報(2024-04-24) C++ の string_view の存在理由がやっと理解できた

# はじめに

例えばパスワードの設定みたいに引数に文字列を渡す事ってとても良くあって、私なんかジジイなので

bool setPassWD(const char* id, const char* pw);

みたいなのが真っ先に頭にうかんできてた時期もあるのですが最近は若者のすなる モダーン な C++ にもがんばってついていこうと努力してるので

bool setPassWD(const string& id, const string& pw);

みたいに書いてたのですが、最近は他の人の書いてるコードみてるとこういう時はほぼ

bool setPassWD(string_view id, string_view pw);

なんですよね

# 疑問点

string_view はコンストラクタで渡される string の文字列リテラルのポインタ^1をコピーして^2、それに string の const なメソッドを被せたようなクラスだと思ってて^3、まさに 関数の引数として文字列を受け取るため にあるようなクラスだというのはわかるのです

でも

  • なんで const string&じゃだめなの?
  • const string& で受けても string_view で受けても引数の内部の文字列リテラルをコピーする事はないんだからコスト的には同じでは?
  • だったらconst string& でも別にいいじゃん

という、まさに string_view のraison d'être に疑問を感じ、腑に落ちないながらも長いものにはまかれろの精神で string_view を使っていました

もしかしたら const& もない分、見た目がスッキリする分ぐらいの差ぐらいに思ってました

# Professional C++, 6th Edition

2024年も4月になった昨今は c++23対応の本 (opens new window) が百花繚乱で、latest な C++ についていけていないという強迫観念に歳悩まされている私なんか暇があると(暇にまかせて?)チョイチョイとつまみ読みしてるのですが、Professional C++, 6th Edition (opens new window) がまさに string_view の section を用意してくれてて、それを読んで目からウロコが落ちる思いをしました

# パラメタが const string& じゃなくて string_view な理由

Professional C++, 6th Edition (opens new window) によるとようするに

  • const char* はさすがにない、string の便利さの恩恵がうけられない
  • const string& だとstring literal を渡した時に string のコンストラクタが動く

前者はさすがに私もそうおもってたのですが、後者、なるほど!いつだって string の参照が渡されるわけではなく、事の良し悪しは別にして文字列リテラルをそのまま関数の引数にベタ書きされることだってあるはずで^4、そんな時に 一旦 string のコンストラクタが動いちゃうのが嫌だったんですね

const char* s を引数にする string のコンストラクタは s の コピーを作る ので、まさに嫌なコストです、まあ id と password ぐらいの文字列長だと大したことないのでしょうけど、長い文字列だったら嫌ですね

結論として

  • なんで const string&じゃだめなの?
    • 引数として文字列リテラルがくる事があるから
  • const string& で受けても string_view で受けても引数の内部の文字列リテラルをコピーする事はないんだからコスト的には同じでは?
    • 文字列リテラルが来るとコピーを作るコストが発生する
  • だったらconst string& でも別にいいじゃん
    • 文字列リテラルが来る可能性を考えると const string& じゃだめ

ということだったんですね それにしても C++ のパフォーマンスへのこだわりは本当に芸が細かいなと思います

# 感想

モダーンな C++ の feature を追っかけてると、それがどういうfeatureなのか は分かるのですが、それがなぜ必要なのかがよくわからなくてモヤモヤする事が多々あるのですが、そういうのがわかった時ってとても嬉しくて、ニワカ者ほど語りたがる の格言どおりについ語ってしまったのが本稿なのでした

もしかしたら貴重な検索空間を某侍とかみたいに汚染してるだけかもしれず、まずはこの場をおかりして謝罪いたします次第です


Last Updated: 2024/7/24 0:41:43