虛繼承解決了從不同途徑繼承的類具有共同基類的問題,使得共同基類只有乙份拷貝。解決了二義性的問題,也節省了記憶體。
虛繼承的一般類圖如下所示:
sizeof(derived) = 40 位元組。經過分析,可以得到derived類在記憶體中的儲存結構示意圖為:
各部分在記憶體中的存放順序為先父類、後子類、最後公共基類,即先存放base1、base2,然後是derived,最後才是base類
對於虛擬繼承,子類中會增加乙個vbptr指標,它指向的值要麼是0,要麼是-4,表示公共基類相對於子類的偏移,也即base類相對於derived類的偏移。當base類中有虛函式時,為-4;否則為0。
在vs編譯器中,子類和公共基類之間會通過乙個null指標分隔開。在其它編譯器中可能沒有這個字段
對於每個類的虛函式表可以依次分析:
簡單的驗證**如下所示:
typedef
void (*fun) (void );
class base
int ba;
virtual
void ff()
int ba;
virtual
void ff()
int ba;
virtual
void bf2()
int da;
void ff()
cout
<
<< " ["
<<0
<
cout
<
<
<
<
cout
<
<< " ["
<<0
<
cout
<
<
<
<
<
<
<
<
<8][0];
for(int i=0;(pfun = (fun)pvtab[8][i])!=null;++i)
cout
<
<
return
0;}
linux 下 C 程式 程序 記憶體布局
記憶體對映段 堆的起始位址加上隨機的偏移量來打亂布局。不幸的是,32 位位址空間相當緊湊,給隨機化所留下的空當不大,削弱了這種技巧的效果 程序位址空間中最頂部的段是棧,大多數程式語言將之用於儲存區域性變數和函式引數。呼叫乙個方法或函式會將乙個新的棧楨 stack frame 壓入棧中。棧楨在函式返回...
C 記憶體布局
注意,上述只描述的是可執行檔案具有三個段,而不是由該三個段構成。在 linux 下,我們可以通過size命令輸出可執行檔案的段資訊。記憶體布局 存放程式指令和字串常量 我們知道,可執行檔案的文字段包含程式的指令,鏈結器把指令直接從可執行檔案拷貝到記憶體中,形成文字段。存放已初始化的全域性變數和sta...
c 記憶體布局
寫好了 只是第一步,接下來還需要編譯生成對應的二進位制才能使用 預處理,編譯,彙編,鏈結 那麼在執行的時候,和資料在記憶體中都是怎麼分布的呢?c的記憶體布局是怎樣的呢?c 的記憶體布局是怎樣的呢?有一點值得注意,c語言和c 的記憶體布局是不一樣的,這也就是平日裡搜尋c 記憶體布局的文章內容總是很相似...