重複の可能性:
C++で「オブジェクトを返す」方法
こんにちは、みんな!
関数からオブジェクトを返す必要がある場合(そしてそれはゲッターではなく、この関数は何らかの理由でコンストラクターとして実装できません。たとえば、同じ署名と異なるセマンティクスを持つコンストラクターがあります)、どのように実装するのが良いですか?これ?
たとえば、次のオプションを提案できます。
1)オブジェクト自体を返します。
MyClass GetMyClass() {
MyClass a;
...
return a;
}
ほとんどの場合、RVO、http://en.wikipedia.org/wiki/Return_value_optimizationが実行され、コピーコンストラクターは呼び出されず、オーバーヘッドはありません。このアプローチの欠点は、RVOにもかかわらず、MyClassのコピーコンストラクターを指定する必要があることですが、GoogleC++スタイルガイドで説明されているように...
C ++でのオブジェクトの暗黙的なコピーは、バグやパフォーマンスの問題の豊富な原因です。
2)オブジェクトへのポインタを返します。
MyClass* GetMyClass() {
MyClass* a= new MyClass();
...
return a;
}
このような場合、ヒープにメモリを割り当てるため、オーバーヘッドが発生します。これにより、mallocシステムコールが原因でプログラムの速度が低下します。また、この関数の外部でメモリを解放する必要があります。つまり、割り当てと解放は異なる論理ユニットで実行されます。ここで述べたように、関数内のmallocメモリを外部に解放するのはなぜ悪い考えですか?多くの場合、それは悪い考えです。
3)参照またはポインタで値を渡します。
void GetMyClass(MyClass& a) {
...
}
この場合、コードは醜くなり、読みにくくなります
ベストプラクティスは何ですか?プロジェクトでどちらを使用し、大きなプロジェクトで作業するときに最も重要な基準はどれですか。