C++では、関数のパラメータ(メソッドのメンバーを含む)は次のように渡すことができます:
例:
void foo(int value); // 値渡し void foo(int* ptr); // ポインタ渡し void foo(const int& ref); // 参照渡し(大きなオブジェクトには最適!)
参照渡しを使用することで最適化(コピーエリジオン)が実現される可能性があり、大きなオブジェクトにはconst &を推奨します。ポインタの場合は常にnullptrでチェックしてください。
const MyClass& objとMyClass objの関数パラメータの違いは何ですか?
答え:
const MyClass&はオブジェクトをコピーせず、変更できないアクセスを提供します(大きなオブジェクトには最適)。MyClass objは常にコピーを作成するため、大きなサイズや適切なコピー(例:ディープコピーが実装されていない)の欠如があると過剰なコストがかかります。
void process(const std::string& s); // コピーしない void process(std::string s); // コピーする
物語 企業の数学構造ライブラリで、プログラマは大きなコンテナを値渡しで渡すことで処理を高速化しようとしました。これにより、各関数呼び出しの際に大きなオーバーヘッドが発生し、パフォーマンスが半分に低下しました。
物語 ユーザー管理モジュールでは、nullptrのチェックなしでポインタが使用されていました。無効なポインタへのアクセス時に偶発的な障害が発生し、デバッグに数ヶ月かかりました。
物語 画像処理プロジェクトの一部の関数はオブジェクトを値渡しで受け取り、別の部分は参照渡しで受け取っていました。あるクラスではディープコピーが実装されておらず、値渡し後にメモリリークやリソースの暗黙の共有が発生しました。