https://www.bilibili.com/video/BV1v64y1q7JT?p=1&spm_id_from=333.788.b_6d756c74695f70616765.1
P11-C++對象布局總覽30:53
對象模型
空對象的 sizeof = 1
對齊
1、原因:
1)平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的溅潜;某些硬件平臺只能在某些地址處取某些特定類型的數(shù)據(jù)术唬,否則拋出硬件異常。
2)性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊滚澜。原因在于粗仓,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問设捐;而對齊的內(nèi)存訪問僅需要一次訪問借浊。
2、規(guī)則
1)數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員萝招,第一個(gè)數(shù)據(jù)成員放在offset為0的地方蚂斤,以后每個(gè)數(shù)據(jù)成員的對齊按照#pragma pack指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長度中,比較小的那個(gè)進(jìn)行槐沼。
2)結(jié)構(gòu)(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后曙蒸,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對齊,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中母赵,比較小的那個(gè)進(jìn)行逸爵。
3)結(jié)構(gòu)體作為成員:如果一個(gè)結(jié)構(gòu)里有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲凹嘲。
3师倔、定義結(jié)構(gòu)體對齊
可以通過預(yù)編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù)周蹭,其中的n就是指定的“對齊系數(shù)”趋艘。
4、舉例
#pragma pack(2)
struct AA {
int a; ??????//長度4 > 2 按2對齊凶朗;偏移量為0瓷胧;存放位置區(qū)間[0,3]
char b; ?//長度1 < 2 按1對齊;偏移量為4棚愤;存放位置區(qū)間[4]
short c; ????//長度2 = 2 按2對齊搓萧;偏移量要提升到2的倍數(shù)6杂数;存放位置區(qū)間[6,7]
char d; ?//長度1 < 2 按1對齊;偏移量為7瘸洛;存放位置區(qū)間[8]揍移;共九個(gè)字節(jié)
};
#pragma pack()
P22-C++對象布局總覽(2)09:15
數(shù)據(jù)成員的聲明順序與內(nèi)存布局
P33-C++對象布局總覽(3)18:21
單繼承的對象布局(非多態(tài))
多繼承和多重繼承的對象布局(非多態(tài))
P44-C++對象布局總覽(4)17:33
單繼承的對象布局(多態(tài))
P55-C++對象布局總覽(5)15:58
打印一個(gè)指向Pint3D對象的指針
打印一個(gè)指向Pint2D對象的指針
26:12
15:55
19:12