首先要分析c++類的記憶體布局,我們應該找到能夠直觀的看到編譯器生成的類的記憶體分布情況,因為我使用的是vs進行開發的,所以使用vs自帶的功能進行檢視。步驟只有一步,就是在命令列中新增
/d1 reportsingleclasslayouta
,這樣就可以在**編譯時,看到類的記憶體分布情況。
2.下面我們寫乙個簡單的類,看以下它的記憶體分布
#include "stdafx.h"
#include #include //由於x86和x64的區別,我們在使用int進行指標轉換的時候,
//會出問題,所以需要引入該檔案對此情況進行處理
using namespace std;
#pragma pack(8) //防止由於位元組對齊不一致,產生的記憶體布局不一致的問題
class a
//成員函式會在存在**區,不會在類內分布
static int bd; //靜態成員變數會在靜態區(也又稱為全域性區的),不會在類內分布
static void sum() {} //靜態成員函式會在**區,不會在類內分布
//畫重點
//一旦出現虛函式,在類的記憶體分布一開始就必須是乙個乙個指向虛表指標
//該虛表維護著該類自己的虛函式的函式指標,儲存的順序和宣告的順序一直。
//當然虛表本身不佔據類的記憶體布局
//虛函式本身不佔據記憶體的分布,也是在**區
virtual int aaa(int a, int b)
virtual int ddd()
//成員變數也是順序和宣告順序是一致的在類內進行排列
int a;
double b;
};//注意這裡需要加上_stdcall,要不會出問題,但是呼叫順序是__cdecl,
//猜測c++底部通過虛表儲存的函式指標的呼叫也是通過_stdcall的方式
typedef void(__stdcall *fun)(int,int);
typedef void(__stdcall *fun1)(void);
int main()
那我們在看下類的實際記憶體分布情況:
首先:類a佔據24個位元組的大小,
其次,虛函式表的指標佔據了類的首位址
再次,虛表中按宣告順序儲存了虛函式的函式指標
再次,成員變數按宣告順序佔據了類的記憶體布局。
再次,靜態成員不佔據類的記憶體布局。
最後,alignment member表示的位元組沒對齊,系統進行的補位操作。如圖就是在a和b之間補了4個位元組。
3.最後在看下執行結果,結果驗證正確
c 類的記憶體布局
本文基本上是對於stanley b.lippman的inside the c object model一書第一章第三章的概括,描述了c 類的記憶體布局情況.c 的類的記憶體布局有如下規則 1.nonstatic data member 存放在class object中 2.static data m...
c 類的記憶體布局
c 中的struct需要記憶體對齊,便於機器訪問該struct。每個物件 如果類含有虛函式 在首位址位置放置了vptr,指向自己的虛函式表。物件中不包含成員函式 靜態的或非靜態的 它們可以被物件共享,靜態成員函式沒有this指標,所以不能被物件呼叫,non static 成員函式隱含有乙個this指...
c 的類的記憶體布局
c 的類的記憶體布局有如下規則 1.nonstatic data member 存放在class object中 2.static data member,static nonstatic member function存放在 class object之外.所有例項執行於32 位機器上測試 規則1和...