0

短縮版:

オブジェクトに std::vector が含まれている場合、ベクトルを値で返す場合と同じ経験則が、そのオブジェクトを値で返す場合に適用されますか?

値によってベクトルを返す「保証」が速いことを私が理解しているC++ 11でこれは変更されますか?

長いバージョン:

std::vector を含む小さなラッパー クラスがあります。

class gf255_poly
{
    public:

        // ... Lots of polynomial methods

    protected:
        std::vector<unsigned char> p;
};

次のような特定の関数からこのクラスのインスタンスを返したいと思います。

// Performs polynomial addition in GF(2^8). 
gf255_poly gf255_poly_add(const gf255_poly &poly1, const gf255_poly &poly2) const
{
    // Initialize:
    gf255_poly dst = poly1;

    // Add all coefficients of poly1 to poly2, respecting degree (the usual polynomial addition)
    for (int deg = 0; deg <= poly2.degree(); deg++)
        dst.addAt(deg, poly2.coef(deg));

    return dst;
}

メンバー ベクトルを返す方法と、std::vector を返すのが依然として悪い設計パターンであるかどうかについて、多くの情報を見つけました (ほとんどの状況では問題ないようです)。ただし、より大きなオブジェクトのメンバーであるベクトルを含むものはあまり見つかりませんでした。

同じアドバイスが当てはまりますか?戻り値の最適化を保証するために、コピー コンストラクターで何か特別なことをする必要がありますか?

この質問に対する答えは、C++ 標準のバージョンによって異なりますか?

4

3 に答える 3

1
  • < c++11 では、戻り値の最適化を行うためにコンパイラに依存する必要があります。

  • >= c++11 では、コンパイラが RVO を実行できない (または実行できない) 場合でも、移動セマンティクスを使用してコードを高速に保つことができます。

この動作を有効にするには、クラスにコンストラクターを移動する必要があります (おそらくデフォルト)。

on move コンストラクターを使用することもでき=defaultます (ただし、Visual Studio 2008 にはこの機能がないようです)。

于 2016-09-09T15:22:46.223 に答える
0

それは、コンパイラがどれだけ賢いかによって異なります (通常はかなり)。したがって、使用している最新のコンパイラで「安全」である必要があります。

于 2016-09-09T15:03:41.860 に答える