四、復(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。
(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<
都知道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。