2013-10-25 25 views
2

如果我有這樣編譯器允許忽略非虛擬私有成員函數嗎?

class A { 
    void private_function(); 
public: 
    void public_function() { /* calls the private function in here */ } 
}; 

一個簡單的類是爲發射用於private_function()對象代碼所需要的編譯器,或者是它允許內聯所有的呼叫,private_function(),並從生成的可執行省略private_function ?

+2

爲什麼重要的是編譯器內聯?只是出於好奇而問。 – andre

+0

你能寫一個可以區分標準的程序嗎?如果不是,則允許。 –

+0

@Pete:當然,但是由於存在無數符合標準的程序,這些程序的表現方式錯綜複雜,有時也很複雜,所以很難回答這個問題。 – Benno

回答

4

要發射目標代碼private_function()

它將不得不如果任何使用其地址所需的編譯器。

或者是否允許內聯所有調用private_function()並從生成的可執行文件中忽略private_function

如果沒有使用它的地址,是的。無論是否生成未使用的非內聯版本,程序的行爲都是相同的;所以通過「似乎」的規則,它是免費的,不會產生它。

+0

你能指出我對odr-used的確切定義嗎? – Benno

+0

@Benno:C++ 11 3.2/2。雖然我可能誤用了這裏的術語 - 如果您調用它,它就是* odr-used *,但是如果您使用它的地址,則只需要一個非內聯定義。 –

+0

@MikeSeymour我相信用內聯函數的地址是完全合法的,不是嗎? –