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

