轉載水木
誤解:inline函數(shù)沒有單獨的函數(shù)體,也不能取地址。
inline修飾并不會改變函數(shù)的通常語義,仍可通過函數(shù)指針調用:
inline?void?f()?{}
void?g()?{
??void?(*p)()?=?f;
??p();
}
------------------------------------------------------------------------
誤解:inline一定導致代碼膨脹
class?Foo?{
public:
????????int?Bar()?{?return?foo;?}
private:
????????int?foo;
};
這樣的Foo::Bar?inline會讓binary變小
------------------------------------------------------------------------
誤解:?inline函數(shù)一定是internal?linkage/no?linkage的。
inline與函數(shù)的linkage無關。inline函數(shù)同樣可以用static和extern修飾,并具
備同一般函數(shù)相同的linkage。標準要求external?linkage的inline函數(shù)在所有編
譯單元中具有相同的地址。external?linkage的inline函數(shù)內定義的靜態(tài)變量同
樣應在所有編譯單元中表現(xiàn)為單一對象,具有相同的地址。
------------------------------------------------------------------------
誤解:?如果inline函數(shù)包含循環(huán)/調用了其他函數(shù)/遞歸調用自己,編譯器就無法
??????將其展開。
某些早期的編譯器有這類限制,但對現(xiàn)代編譯器來說它們不再是inline展開的障
礙了。
[insert?RoachCock's?example?here]
------------------------------------------------------------------------
誤解:inline和virtual不能同時修飾一個函數(shù)。
inline和virtual并不沖突。以下程序編譯通過。
#include?<iostream>
struct?A
{
??inline?virtual?void?f()
??{
????std::cout?<<?"inline?virtual"?<<?std::endl;
??}
};
------------------------------------------------------------------------
誤解:virtual函數(shù)即使聲明為inline,由于是late?binding,無法判斷實際
??????調用的版本,編譯器也無法展開。
虛函數(shù)調用并不總是late?binding。
示例:
struct?Base
{
??virtual?void?foo(){cout?<<?"Base::foo"?<<?endl;}
};
struct?Derived?:?Base
{
??void?foo(){cout?<<?"Derived::foo"?<<?endl;}
};
void?bar(Base&?b)
{
??b.foo();??//?late?binding.?if?b?is?a?Derived,?call?Derived::foo
??b.Base::foo();??//?early?binding.?inline
??Derived?d;
??d.foo();??//?early?binding.?inline
}
另外,盡管在您的編譯器中很可能還沒有實現(xiàn),但即使late?binding理論上也是
可以展開的。