ホームページ バックエンド開発 C++ やはり std::string を const & で渡す必要がありますか?

やはり std::string を const & で渡す必要がありますか?

Dec 12, 2024 pm 02:27 PM

Should We Still Pass std::string by const &?

Const Std::string とパラメータの過ぎ去った時代

最近の議論の中で、Herb Sutter は、 const & パラメータで std::vector と std::string を渡すと、同じ重みが保持されなくなる可能性があります。これらのオブジェクトを値で渡すという彼の提案した代替案は議論を引き起こし、疑問を引き起こしました。

移行を理解する

なぜ Sutter はこの移行を提唱したのでしょうか?主な理由は、以下で説明するシナリオと同様のシナリオにあります。

関数 B を呼び出し、関数 B が関数 C を呼び出す関数 A を考えてみましょう。関数 A は、文字列を B 経由で C に渡し、文字列を認識しないままにします。 C の存在。

定数とアプローチ:

B と C が文字列を次のように受け取るときconst とパラメータの場合、相互作用は次のように発生します:

void B(const std::string &str) {
  C(str);
}

void C(const std::string &str) {
  // Manipulates `str` but does not store it.
}
ログイン後にコピー

このアプローチはポインタを効果的に循環させ、不必要なコピーや移動を回避します。 C は、文字列を保存するのではなく使用するだけなので、const & を受け入れます。

値のアプローチ:

ただし、C の機能で文字列を保存する必要がある場合は、文字列を保存する必要があります。

void C(const std::string &str) {
  // Manipulates `str`.
  m_str = str;
}
ログイン後にコピー

ご覧のとおり、C は単に文字列を使用するだけでなく、文字列を保存することもできます。 C 11 の移動セマンティクスは理論的には不必要なコピーを排除するはずですが、C の const & パラメータがこれを防ぎます。代わりに、コピー コンストラクターと潜在的なメモリ割り当てが機能します。

Const & のバイパス:

const & パラメーターをバイパスし、すべての関数を通じて文字列を値で渡すことで、これを排除できます。問題。 std::move は、必要に応じてデータを効率的にシャッフルできます。関数が文字列を保持する場合は、そうすることができます。

パフォーマンスに関する考慮事項:

値による受け渡しでは、参照を使用する場合と比較してパフォーマンスのコストが高くなります。ただし、SSO の恩恵を受ける小さな文字列の場合、コストは無視できます。

結論

const & または value で std::string を渡すかどうかの決定は、次の点に依存します。特定の使用例とメモリ割り当てに対するその感度。値による受け渡しは一般的に好ましいとは限りませんが、特定の状況では説得力のある利点が得られます。

以上がやはり std::string を const & で渡す必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

See all articles