我在討論中被問到在C++類中添加虛擬函數有什麼缺點。我說過一個缺點是類的對象有一個指向它的虛擬表的指針,對於一個小的C++類,它在64位平臺上增加了8個字節的大小。如果創建數百萬個這樣的類的實例會增加程序的內存消耗。確定,但爲什麼實際上在C++中沒有像虛擬表的小指針或指向虛擬表的小指針或指向虛擬表的小型指針這樣的事情。有些事情是這樣的:具有虛擬功能的緊湊型課程
class [[compact]] base {
~base(){}
virtual f() = 0;
};
class [[tiny]] another_base {
~base(){}
virtual g() = 0;
};
class [[small]] yet_another_base {
~base(){}
virtual h() = 0;
};
class child : public base {
virtual f();
};
class user_type : public another_base {
~base(){}
virtual g();
};
想象一下,我要創造大量的user_type
實例(其實我曾經有過一個真正的程序這種情況)。默認情況下,編譯器創建大小爲8(64位)的user_type
實例。但是[[tiny]]屬性只有它可能只有1個字節,[[compact]]只有4個字節。
此功能是否可用?如果不是這樣,我覺得可以實現它。就像在程序中隱藏tiny_vptr
和compact_vptr
,並且當需要找到一個指向vtable的實際指針時,只需向它們添加第一個字節或前四個字節即可。所以在一個程序中,它只允許有256個[[tiny class]]或65000個[[small]]類。它就像是最高速度和節省內存之間的選擇。
如果實現它,只會在派生類的第一個成員是1字節對齊的情況下(否則會在vtable指針和第一個成員之間填充字節)僅節省內存。我想你可以強制派生類被緊密打包,所以不會有填充字節,但是你只是進入了奇怪的特定於領域的領域。 – Cornstalks
虛擬函數的真正危害並不是因爲vptr,而是因爲它們的不可插入性。 – SergeyA
@SergeyA:OP正在詢問有關保存內存的問題。不可內聯性不會真的影響到這一點。 – Cornstalks