昨日行ったプログラミングインタビューで、私が書かなければならなかったプログラムの1つは、次のようなものになってしまいました。
struct Blob
{
// basic field containing image blob statistics.
};
std::vector<Blob> find_blobs (const Image& ...)
{
std::vector<Blob> blobs;
// ...
return blobs;
}
私は戻り値の最適化(RVO)に精通しているので、ベクトルを返しても一般的なコンパイラではコピーが発生しないことを説明しました(最後の行に単一のreturnステートメントがあり、制御パスは別のオブジェクトを返すことができません私が書いたコード)。
ただし、インタビュアーはBlob
、複雑なユーザー定義型(UDT)である可能性があるため、コンパイラーがRVOを実行できない可能性があると教えてくれました。彼はさらに、aを返すstd::vector<Blob*>
と、コンパイラがコピーの省略を実行する可能性が高くなると付け加えました。
私の理解の限りでは、コンパイラがRVOを実行する能力は、返されるオブジェクトのタイプとは完全に無関係です。ただし、コピーできないオブジェクトを除いて、結果のコードがコードであっても、コンパイラはコードを拒否します(すべきですか?)コピーコンストラクタを呼び出さずにコンパイルできます。
それで、インタビュアーは正しかったですか?複雑な戻り型は、コンパイラーがRVOを適用するのを防ぐことができますか?