C 記憶體布局(下)

2021-07-10 08:27:05 字數 1203 閱讀 5798

虛繼承解決了從不同途徑繼承的類具有共同基類的問題,使得共同基類只有乙份拷貝。解決了二義性的問題,也節省了記憶體。

虛繼承的一般類圖如下所示:

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 記憶體布局的文章內容總是很相似...