簡體   English   中英

禁用分配運算符優化的GCC選項是什么

[英]What is the GCC option for disabling assignment operator optimizations

讓我們從這個小例子開始:

#include <vector>
#include <iostream>

using namespace std;

class A {
private:
    A& operator =(const A&);
};

int main(void) {
    vector<A> v;
    v = { A() };
    return 0;
}

此代碼的編譯失敗,並顯示錯誤消息error: 'A& A::operator=(const A&)' is private 我不知道為什么它需要賦值運算符,所以我試圖找出並更改代碼為:

#include <vector>
#include <iostream>

using namespace std;

class A {
public:
    A& operator =(const A& a) { cout << "operator=" << endl; return *this; }
};

int main(void) {
    vector<A> v;
    v = { A() };
    return 0;
}

現在代碼可以編譯,但是當我執行它時,它不會在賦值運算符實現中輸出調試消息。

因此,編譯器需要賦值運算符,但不使用它嗎? 我猜編譯器會以某種方式優化分配。 就像它優化了移動構造函數的用法一樣(可以使用-no-elide-constructors選項來避免這種情況)。 有沒有可以防止分配優化的編譯器選項? 還是有不同的解釋,為什么編譯器希望具有可訪問的賦值運算符,但在運行時不使用它?

在C ++ 03中,存儲在容器中的類型需要為CopyConstructibleAssignable 在C ++ 11中,放寬了要求並將其應用於在容器上執行的操作。

class A必須是CopyConstructibleAssignable因為它存儲在vector這就是為什么需要public operator=

int main(void) {
    vector<A> v;
    v = { A() }; // Copy Constructor

    A x;
    x = v[0]; // operator=
    return 0;
}

我有點晚了,但我仍然想回答你的問題。

您的示例顯示了C ++的標准復制省略 這也在另一個問題中討論。

也就是說,編譯器檢查操作的正確性 您必須在默認構造函數之后立即調用復制構造函數以使用vector並將類放入內部,但是僅為了提高性能調用默認構造函數

C ++ 11通過move構造函數解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM