2011-08-30 72 views
6

海灣合作委員會內部聲明 - 無論我多麼努力地嘗試阻止它。我試圖如何防止海灣合作委員會內聯

  • -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」 在現實生活中包含需要照顧的動態分配的數據。

我在這裏錯過了一些明顯的東西嗎?!

+2

嘗試'-fno-elide-constructors'。 (並且請注意,由於在類定義中定義了構造函數,所以你已經聲明瞭你的構造函數是內聯的。) –

+1

這真的是內聯嗎?它看起來像我的RVO。 –

+0

感謝您的回答!事實上,它不是內聯的。這是優化。有了這個,我會看到如果讓我的真實生活結構工作。 (目前它沒有)。一個問題:關閉這種優化可能性(-fno-elide-constructors)是否會改變程序的行爲(比如複製構造函數包含重要的代碼),除了速度? – ritter

回答

15

不,這與內聯函數無關。內聯函數不會改變可觀察到的行爲。

這是一個稱爲複製elision的優化,它允許編譯器通過在目標處直接構造返回值來避免複製。您可以使用g ++標誌-fno-elide-constructors將其禁用。

在任何情況下,動態分配的數據都不應該是一個問題。假設一個合理的拷貝構造函數,你將看到的唯一區別可能是更好的性能。

5

如果struct A包含動態分配的數據,那麼您有責任在適當的析構函數/構造函數中管理該內存。許多類管理動態分配的數據,並且在橢圓拷貝的情況下工作得很好。 RVO和NRVO是重要的優化。

相關問題