class A{
void virtual a(){}
};
int main() {
std::cout<<sizeof(A);
}
在上述情況下,爲什麼編譯器沒有使函數變爲非虛擬並保存分配給它的空間。有沒有特定的理由不這樣做?爲什麼編譯器在可能的情況下不能編譯虛擬函數?
我使用gcc 4.7編譯器,如果它是編譯器特定的。
class A{
void virtual a(){}
};
int main() {
std::cout<<sizeof(A);
}
在上述情況下,爲什麼編譯器沒有使函數變爲非虛擬並保存分配給它的空間。有沒有特定的理由不這樣做?爲什麼編譯器在可能的情況下不能編譯虛擬函數?
我使用gcc 4.7編譯器,如果它是編譯器特定的。
因爲您可以在單獨的翻譯模塊中創建派生類。
從理論上講,這可以在鏈接時解決,但這會涉及很多工作,所以在實踐中不會發生(AFAIK)。
對於動態庫,即使LTO也不能排除子類可能會輸入圖片。至少直到LTO被應用到動態連接器上也是如此;-) – delnan
編譯器本身可能不會這樣做,因爲它不知道其他文件中的內容。
鏈接器可能能夠做到這一點,但不能保證A的後代版本不存在於某處,並且將被加載到單獨的模塊中。
因爲編譯器無法準確確定您是否使用動態分派機制。它不能認爲你只是通過檢查當前的TU。 –
對於一個相關的問題,值得注意的是,現在大多數編譯器可以在編譯時確定虛擬函數的哪個超載被調用時可以內聯虛函數。 – zindorsky