大きなベクトルを設定する関数の戻り値としてauto_ptrを使用すると、関数がソース関数になります(内部auto_ptrが作成され、 const auto_ptr)。しかし、データにアクセスするためには、auto_ptrを削除する必要があるため、この関数をSTLアルゴリズムで使用することはできません。私が推測する良い例は、サイズNのベクトルのフィールドであり、各ベクトルは100の成分を有する。 Wetherは、100の成分ベクトルを値ごとに返します。あるいは、Nが大きい場合、refは同じではありません。また大きな値のベクトルに対する戻り値の最適化とauto_ptr
、私はこの非常に基本的なコードを試してみてください。
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
autoFunと楽しコールの両方をので、私は実際に自動変数これを見ることができない出力
CTOR デストラクタ
となりますreturn文に渡されるように作成されています。これは、戻り値の最適化がvalueFun呼び出しに設定されていることを意味しますか?この場合、valueFunは2つの自動オブジェクトを作成しますか?
このような大きなデータ構造の母集団を関数で最適化するにはどうすればよいですか?
RVOがあなたの大きなベクトルでも機能するかどうか尋ねていますか?もしそうなら、上記のような例でテストすることはできませんか? – juanchopanza
私がテストすると、すべてのコンパイラ/プラットフォームで動作するのでしょうか?コンパイラの仕様を読めば、RVOがまったく含まれていることをどのように知ることができますか?別のコンパイラを使用してHPCクラスター上でコードをコンパイルし、そのライブラリーが大きい場合はどうなりますか? – tmaric
ええ、あなたのことが分かります。コンパイラが許可されているが、必須ではないことの1つであるため、決して確実ではありません。あなたはC++ 11をサポートしていますか? – juanchopanza