2010-01-28 95 views
2

我期待在該位文本在documentation爲Visual C++的_ReadWriteBarrier稟道:_ReadWriteBarrier如何傳播呼叫樹?

在Visual C++ 編譯器,_ReadWriteBarrier和 _WriteBarrier功能只在本地執行以前的版本並沒有影響 在呼叫樹上起作用。在Visual C++ 2005和更高版本的Visual 中,這些函數 在調用 樹時一直執行。

我明白了一個函數內的勢壘做什麼,但「調用樹」似乎暗示了一個功能foo()調用函數bar()可以知道bar()是否包含屏障與否。在VC2005中實際上改變了什麼以實現......調用約定/ ABI,由編譯器完成的一些全局分析,還是什麼?

回答

1

MS文檔從來都不是很棒,這是一個很好的例子。有2份到_ReadWriteBarrier:

  1. 告訴CPU做一個存儲器屏障(即MFENCE),
  2. 告訴編譯器不圍繞屏障優化。

我懷疑調用樹部分是指#2。即:

int x = 0; 

void foo() 
{ 
    x = 7; 
    _ReadWriteBarrier(); 
    x = 8; 
} 

沒有障礙,x = 7可以被編譯器完全刪除。有了障礙,它仍然存在。 現在,叫做 foo的功能呢?

void bar() 
{ 
    x = 3; // optimized away? 
    foo(); 
    x = 4; 
} 

我認爲在過去的X = 3可能被優化掉(這是很難讓編譯器知道這是否是允許或不允許),但現在會正確地保持在x = 3的說明。

我想。

+1

這也是我對MS文檔的理解。但是編譯器如何實現這種行爲呢?如果答案僅僅是所有非內聯函數調用都是編譯器重新排序的屏蔽,那麼爲什麼引用早期版本的VC沒有實現? – shojtsy 2010-04-23 06:16:17

+0

我真的不知道。它可以用鏈接器解釋的屬性標記每個功能。這可能與它們在lib或至少在編譯過程中至少在對象字典中如何命名mangling或複雜的數據庫一樣簡單......但是,通常在過去的編譯器中,通常認爲它們無法看到的功能最差,因此不會圍繞它進行優化。也許他們變得更聰明,他們需要公開更多信息。 – tony 2010-04-24 02:34:25