4 回答

TA貢獻1828條經(jīng)驗 獲得超6個贊
inline111.cpp:
#include <iostream>void bar();inline int fun() { return 111;}int main() { std::cout << "inline111: fun() = " << fun() << ", &fun = " << (void*) &fun; bar();}
inline222.cpp:
#include <iostream>inline int fun() { return 222;}void bar() { std::cout << "inline222: fun() = " << fun() << ", &fun = " << (void*) &fun;}
案例A:
編譯:
g++ -std=c++11 inline111.cpp inline222.cpp
輸出量:
inline111: fun() = 111, &fun = 0x4029a0inline222: fun() = 111, &fun = 0x4029a0
討論:
即使您應該對內(nèi)聯(lián)函數(shù)有相同的定義,如果情況并非如此,C+編譯器也不會標記它(實際上,由于 單獨匯編它沒有辦法檢查)。確保這一點是你自己的責任! 鏈接器不抱怨 一種定義規(guī)則,如 fun()
被宣布為 inline
..但是,因為 inline111.cpp是第一個翻譯單元(它實際上調(diào)用 fun()
)由編譯器處理,編譯器實例化 fun()
在它 第一打電話 inline111.cpp..如果編譯器決定 不擴大 fun()
應您程序中其他任何地方的要求( G.從… inline222.cpp)的電話 fun()
將始終鏈接到其生成的實例。 inline111.cpp(電話: fun()
內(nèi) inline222.cpp也可以在該翻譯單元中生成一個實例,但它將保持不鏈接)。事實上,這一點從相同的 &fun = 0x4029a0
打印出來。 最后,盡管 inline
對編譯器的建議 實際擴展一條龍 fun()
,它 視而不見你的建議很清楚,因為 fun() = 111
在這兩條線上。
案例B:
編譯 (通知反向命令):
g++ -std=c++11 inline222.cpp inline111.cpp
輸出量:
inline111: fun() = 222, &fun = 0x402980inline222: fun() = 222, &fun = 0x402980
討論:
這個案例證明了 案件A.注意一個重要的問題,如果您注釋掉實際調(diào)用 fun()
在……里面 inline222.cpp (G.注釋掉 cout
-聲明 inline222.cpp完全)那么,盡管你的翻譯單位的匯編順序, fun()
中的第一次調(diào)用時將被實例化。 inline111.cpp的打印結果 案例B如 inline111: fun() = 111, &fun = 0x402980
.
案例C:
編譯 (公告-O2):
g++ -std=c++11 -O2 inline222.cpp inline111.cpp
或 g++ -std=c++11 -O2 inline111.cpp inline222.cpp
輸出量:
inline111: fun() = 111, &fun = 0x402900inline222: fun() = 222, &fun = 0x402900
討論:
原樣 在此描述 ,-O2
優(yōu)化鼓勵編譯器 實際擴展
可以內(nèi)聯(lián)的函數(shù)(也請注意, -fno-inline
是 違約
沒有優(yōu)化選項)。從這里的輸出可以看出, fun()
實際上 內(nèi)聯(lián)擴展
(根據(jù)它的定義 特別
翻譯股),產(chǎn)生兩個 異類
fun()
打印出來。盡管如此,還是有 只有一個
全局鏈接實例 fun()
(按照標準的要求),從 完全相同
&fun
打印出來。

TA貢獻1786條經(jīng)驗 獲得超11個贊
什么時候我不應該為C+中的函數(shù)/方法寫關鍵字“內(nèi)聯(lián)”呢?
.cpp
編譯器什么時候不知道什么時候使函數(shù)/方法‘內(nèi)聯(lián)’?
當一個應用程序為函數(shù)/方法寫“內(nèi)聯(lián)”時,應用程序是否是多線程的?
- 4 回答
- 0 關注
- 647 瀏覽
添加回答
舉報