C++sizeof使用規(guī)則及陷阱分析(3)

字號:

四、復(fù)雜數(shù)據(jù)類型中sizeof及其數(shù)據(jù)對齊問題
    (1)、union的sizeof問題與cpu的對界
    考慮下面問題:(默認(rèn)對齊方式)
    1 union u //8對齊
    2 {
    3 double a;
    4 int b;
    5 };
    6
    7 union u2 //4對齊
    8 {
    9 char a[13];
    10 int b;
    11 };
    12
    13 union u3 //1對齊
    14 {
    15 char a[13];
    16 char b;
    17 };
    18
    19 cout<    20 cout<    21 cout<    22
    都知道union的大小取決于它所有的成員中,占用空間的一個(gè)成員的大小。所以對于u來說,大小就是的double類型成員a了,所以sizeof(u)=sizeof(double)=8。但是對于u2和u3,的空間都是char[13]類型的數(shù)組,為什么u3的大小是13,而u2是16呢?關(guān)鍵在于u2中的成員int b。由于int類型成員的存在,使u2的對齊方式變成4(4字節(jié)對齊),也就是說,u2的大小必須在4的對界上,所以占用的空間變成了16(最接近13的對界)。
    結(jié)論:復(fù)合數(shù)據(jù)類型,如union,struct,class的對齊方式為成員中對齊方式的成員的對齊方式。
    編譯器對界:
    首先解釋下CPU對界問題,32的C++采用8位對界來提高運(yùn)行速度,所以編譯器會盡量把數(shù)據(jù)放在它的對界上以提高內(nèi)存命中率。
    通過程序可以改變編譯器對界,使用#pragma pack(x)宏可以改變編譯器的對界方式,默認(rèn)是8。