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

字號(hào):

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