3

C++ の式テンプレートの標準的なピッチは、不要な一時オブジェクトを削除することで効率を高めるというものです。C++ コンパイラがこれらの不要な一時オブジェクトを削除できないのはなぜですか?


これは私がすでに答えを知っていると思う質問ですが、オンラインで低レベルの答えを見つけることができなかったので確認したいと思います.

式テンプレートは基本的に極端なインライン化を許可/強制します。ただし、インライン化を行っても、コンパイラはoperator newandへの呼び出しを最適化できませんoperator delete。これらの呼び出しは、他の翻訳単位でオーバーライドできるため、これらの呼び出しを不透明なものとして扱うためです。式テンプレートは、中間オブジェクトの呼び出しを完全に削除します。

operator newandへのこれらの不要な呼び出しはoperator delete、コピーするだけの簡単な例で見ることができます。

#include <array>
#include <vector>

std::vector<int> foo(std::vector<int> x)
{
    std::vector<int> y{x};
    std::vector<int> z{y};
    return z;
}

std::array<int, 3> bar(std::array<int, 3> x)
{
    std::array<int, 3> y{x};
    std::array<int, 3> z{y};
    return z;
}

生成されたコードでは、が を 2 回呼び出し、 whileを 1foo()回呼び出して比較的長い関数にコンパイルされ、レジスタの転送のみにコンパイルされ、不要なコピーが行われないことがわかります。operator newoperator deletebar()

この分析は正しいですか?

C++ コンパイラは合法的にコピーを省略できますfoo()か?

4

2 に答える 2