海灣合作委員會內部聲明 - 無論我多麼努力地嘗試阻止它。我試圖如何防止海灣合作委員會內聯
-fno-inline
-O0
__attribute__ ((noinline))
dummy asm("")
沒有成功! 這裏的代碼:
#include<iostream>
using namespace std;
struct A {
A() {cout << "A::A()" <<endl; }
A(const A& a) {cout << "A::A(copy)" <<endl; }
A& operator=(const A& a) {cout << "A::=()" <<endl; return *this;}
};
A __attribute__ ((noinline)) func()
{
cout << "func()" << endl;
A loc;
asm("");
return loc;
}
int main() {
A a = func();
}
這樣做的不幸輸出(G + +(Ubuntu的/ Linaro的4.5.2-8ubuntu4)4.5.2)是
func()
A::A()
發生了什麼事陳述A A = FUNC (); ??
這樣做的原因實驗是,我想知道發生了什麼,當執行來到這個說法(因爲我需要控制如何做到這一點):
A a = func();
,我讀了拷貝構造函數被調用當一個不
A a = b;
(在這種情況下複製構造函數被調用,但不能在情況A A = FUNC();) 該函數代替內聯。 I 需要控制此聲明,因爲我的「結構A」 在現實生活中包含需要照顧的動態分配的數據。
我在這裏錯過了一些明顯的東西嗎?!
嘗試'-fno-elide-constructors'。 (並且請注意,由於在類定義中定義了構造函數,所以你已經聲明瞭你的構造函數是內聯的。) –
這真的是內聯嗎?它看起來像我的RVO。 –
感謝您的回答!事實上,它不是內聯的。這是優化。有了這個,我會看到如果讓我的真實生活結構工作。 (目前它沒有)。一個問題:關閉這種優化可能性(-fno-elide-constructors)是否會改變程序的行爲(比如複製構造函數包含重要的代碼),除了速度? – ritter