MSVC C 物件記憶體分配方式學習

2021-07-10 21:34:03 字數 493 閱讀 2239

c++由於多繼承、虛擬繼承、虛函式等概念,導致物件的記憶體分配方式比較複雜。因此c++的物件記憶體分配也成為c++面試中經常被問到的乙個知識點。

1. 這篇文章裡提到的要點是gcc和vc的編譯器在處理虛整合時的機制是不一樣的,gcc始終共享虛表指標vfptr(指向虛函式表),而vc只有在非虛繼承時才共享vfptr。

2. 這篇文章詳細的介紹了各種情況下vc對物件記憶體的分配。

這裡總結一下msvc物件記憶體的分配:

1. 若祖先沒有vfptr,當前類有vfptr,則vfptr放在最前方,其次是各個祖先的成員,然後是自己的成員,最後是虛繼承的類的成員。

2. 若祖先有多個,有的祖先有vfptr,有的祖先沒有vfptr,則有vfptr的祖先成員放在最前方,其次是其他祖先的成員,然後是自己的成員,最後是虛繼承的類的成員。

3. 若使用虛繼承,則vfptr不會被共享,若當前類override虛父類的函式,則更新虛父類的虛函式表;若當前類定義新的virtual函式,則為當前類新建乙個虛函式表。

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...

記憶體分配方式

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...