編譯器如何處理一個完整的空函數在運行時表現?調用一個空的基類函數,在編譯時會發生什麼?
class Base
{
public:
virtual void execute(){ /* always empty */ }
};
示例用法:
int main()
{
Base b;
b.execute();
return 0;
}
正在創建其應該能夠有亞類,其僅保持數據的實體的系統。這些被稱爲Properties
。有些需要有一個操作函數來結束數據。這些類被稱爲Component
。
其目的是爲了能夠在運行時爲一個類添加功能,甚至以後可以使用其他共享庫添加功能。
由於所需的靈活性,並保持儘可能簡單的夢想,我想出了一個共享Base
類的Properties
和Component
類。請參閱下面的代碼塊。
但是,類Base
包含功能,並在分配給該類的所有屬性和組件中在最終類Container
中調用。
也許最好將Property
和Component
完全分成兩個不同的身份,但是它們會相互依賴,例如,屬性可以是變換(位置,比例,四元數,矩陣),而組件可以是變換中四元數的動畫。
#include <vector>
class Base
{
public:
virtual void execute(){ /* always empty */ }
};
class Property // as manny will be
: public Base
{
public:
/* specifics */
};
class Component // as manny will be
: public Base
{
public:
/* specifics */
virtual void execute(){ /* do whatever */ }
};
class Container
{
public:
std::vector<Base*> list;
virtual void execute()
{
std::vector<Base>::iterator iterator = list.begin(), end = list.end();
while(iterator != end)
(*iterator)->execute();
}
}
不知道什麼編譯器實際上除了生成二進制文件呢,我不認爲這將是一個調試會話一行去一行的等效。
編譯器如何處理這樣一個空函數,最好是將function execute();
作爲第一個聲明移動到Component
類。然後將enum{ Property, Component };
添加到類Property
,以便if語句可以確定調用執行函數。
我低估了這一點,因爲它是另一個「我盯着一些代碼並對編譯器工作做出假設」 - 問題。所有這些問題的唯一答案:儘可能編寫最合理和可讀的代碼,然後通過測量優化您發現速度太慢的問題。 – 2015-02-10 22:27:03
如果我理解了你沒有問的問題,那麼:在從Base派生的層次結構中添加更多層是否會產生額外的運行時成本?如果只有最派生類實際上在execute()中做了任何事情,答案是否定的。如果它調用一個父類'執行並且該函數在另一個翻譯單元中,那麼它會引起一個額外的函數調用。 – qeadz 2015-02-10 22:31:41
@qeadz:不會退出,儘管你的回答確實消除了我在獲得這個問題的輸入之後所針對的另一個不安全感。 – Ruijter 2015-02-10 22:55:00