我認爲編譯器更有可能進行更大規模的優化。你必須檢查實際的機器代碼生成,但例如以下瑣碎的嘗試:
#include <iostream>
class B {
public:
void F(int x, int y) {
std::cout << x << ", " << y << std::endl;
}
};
class A {
B b;
public:
void F(int x, int y) {
b.F(x, y);
}
};
int main() {
A a;
a.F(32, 64);
}
會導致編譯器(cl.exe從2010年VS,空項目,香草「發佈」配置)生成彙編完全內聯在調用樹上;你基本上得到「推40小時,推20小時,打電話std ::運營商< <」。
濫用__declspec(noinline)
會導致cl.exe意識到A :: F只是轉發到B :: F,而A :: F的定義只是「調用A :: F」而沒有任何堆棧或寄存器操作所以在這種情況下,它已經執行了你所要求的優化)。但是請注意,我的例子非常有人氣,所以一般來說編譯器沒有能力做到這一點,只是它可以完成。
在您的真實世界中,您必須自己檢查反彙編。特別是,需要考慮'this'參數(cl.exe通常通過ECX寄存器傳遞它) - 如果您對可能影響結果的類成員變量進行了任何操作。
問題是什麼? – Arun 2010-09-23 15:34:30
你問是否編譯器將內聯所有這些函數調用? – 2010-09-23 15:36:00
與這樣的小成員,你應該把它們放在類的主體 - 他們將自動內聯屬性,並將內聯(如果優化)。也有其他的事情。與您可以考慮做只頭文件對他們這樣的小功能。項目將加快編制,將是一個有點小 – fazo 2010-09-23 15:50:11