6

次のコードを書きました。

class MyObjectHolder {
public:
    std::vector<int> getMyObject() const {
        return myObject;
    }

private:
    std::vector<int> myObject;
};

プログラムのある時点で、メソッドを使用しようとし、取得したオブジェクトに対してメソッドgetMyObjectのみを使用します。const

const std::vector<int> myObject = myObjectHolder.getMyObject();
myObject.size();
int a = myObject.front();
  • さて、コンパイラがこのコードを最適化して、コピーstd::vector<int>が行われないようにすることは可能でしょうか?

    コンパイラーがconst、取得したオブジェクトのメソッドのみを使用していると判断し (その背後でナンセンスが発生していないと仮定しましょうmutable) 、オブジェクトのコピーを作成せず、これらのconst操作をprivateメンバーに対して実行する可能性はありますか?MyObjectHolder代わりに?

  • const std::vector<int> myObjectはいの場合、 as を明示的に宣言しなければ可能でしょうconstか?

  • いいえの場合、これを行わない理由は何ですか? どのような場合に、この最適化を実装するのが難しいか、可能であると推測し、ここで修正するかなど...?

4

3 に答える 3

6

さて、コンパイラがこのコードを最適化して、コピーstd::vector<int>が行われないようにすることは可能でしょうか?

いいえ、コンパイラは、オブジェクトを使用するすべてのコードに対してグローバル最適化を使用しない限り、呼び出し元がそのオブジェクトで何をするかを知りません (コンパイラは通常、その使用について推測できません。さらに、オブジェクトがdll では、まったく想定できません)。

はいの場合、const std::vector myObject を const として明示的に宣言しなかった場合、可能でしょうか?

いいえ、とにかく、非 const から const への変換は暗黙的である可能性があります。

いいえの場合、これを行わない理由は何ですか? どのような場合に、この最適化を実装するのが難しいか、可能であると推測し、ここで修正するかなど...?

内部で実行する必要があるのは最適化ですgetMyObject()が、コンパイラは、呼び出し元が const をキャストしないことを確認できません。実際、これは の使用に関する非常に古い議論です。通常、常にコンパイラーではなくプログラマー向けのものとしてconst考える方が明確だと思います。const

于 2012-05-30T14:31:26.163 に答える
3

使用することをお勧めします

const std::vector<int>& getMyObject() const {
    return myObject;
}

それをコピーせずに myObject の定数参照を返します。

そして結果を

const std::vector<int>& myObject = myObjectHolder.getMyObject();
于 2012-05-30T14:31:16.930 に答える
0

Copy Elision戻り値の最適化が開始される可能性があります。C++11をサポートする C++ コンパイラを使用する場合は、ムーブ セマンティクスによって最適化される可能性があります。

優れた記事「Want Speed? 」を読むことをお勧めします。Dave Abrahams によるPass by Valueとその下のコメントでの議論。

ただし、詳細については、C++ コンパイラのドキュメントを参照してください。

于 2012-06-27T09:33:45.110 に答える