考慮下面問題:(預設對齊方式)
union u
; union u2
; union u3
; cout<
都知道union的大小取決於它所有的成員中,占用空間最大的乙個成員的大小。所以對於u來說,大小就是最大的double型別成員a了,所以sizeof(u)=sizeof(double)=8。但是對於u2和u3,最大的空間都是char[13]型別的陣列,為什麼u3的大小是13,而u2是16呢?關鍵在於u2中的成員int b。由於int型別成員的存在,使u2的對齊方式變成4,也就是說,u2的大小必須在4的對界上,所以占用的空間變成了16(最接近13的對界)。
結論:復合資料型別,如union,struct,class的對齊方式為成員中對齊方式最大的成員的對齊方式。
順便提一下cpu對界問題,32的c++採用8位對界來提高執行速度,所以編譯器會盡量把資料放在它的對界上以提高記憶體命中率。對界是可以更改的,使用#pragma pack(x)巨集可以改變編譯器的對界方式,預設是8。c++固有型別的對界取編譯器對界方式與自身大小中較小的乙個。例如,指定編譯器按2對界,int型別的大小是4,則int的對界為2和4中較小的2。在預設的對界方式下,因為幾乎所有的資料型別都不大於預設的對界方式8(除了long double),所以所有的固有型別的對界方式可以認為就是型別自身的大小。更改一下上面的程式:
#pragma pack(2)
union u2
; union u3
;#pragma pack(8)
cout<
由於手動更改對界方式為2,所以int的對界也變成了2,u2的對界取成員中最大的對界,也是2了,所以此時sizeof(u2)=14。
結論:c++固有型別的對界取編譯器對界方式與自身大小中較小的乙個。
9、struct的sizeof問題
因為對齊問題使結構體的sizeof變得比較複雜,看下面的例子:(預設對齊方式下)
struct s1
; struct s2
; cout<
同樣是兩個char型別,乙個int型別,乙個double型別,但是因為對界問題,導致他們的大小不同。計算結構體大小可以採用元素擺放法,我舉例子說明一下:首先,cpu判斷結構體的對界,根據上一節的結論,s1和s2的對界都取最大的元素型別,也就是double型別的對界8。然後開始擺放每個元素。
對於s1,首先把a放到8的對界,假定是0,此時下乙個空閒的位址是1,但是下乙個元素d是double型別,要放到8的對界上,離1最接近的位址是8了,所以d被放在了8,此時下乙個空閒位址變成了16,下乙個元素c的對界是4,16可以滿足,所以c放在了16,此時下乙個空閒位址變成了20,下乙個元素d需要對界1,也正好落在對界上,所以d放在了20,結構體在位址21處結束。由於s1的大小需要是8的倍數,所以21-23的空間被保留,s1的大小變成了24。
對於s2,首先把a放到8的對界,假定是0,此時下乙個空閒位址是1,下乙個元素的對界也是1,所以b擺放在1,下乙個空閒位址變成了2;下乙個元素c的對界是4,所以取離2最近的位址4擺放c,下乙個空閒位址變成了8,下乙個元素d的對界是8,所以d擺放在8,所有元素擺放完畢,結構體在15處結束,占用總空間為16,正好是8的倍數。
這裡有個陷阱,對於結構體中的結構體成員,不要認為它的對齊方式就是他的大小,看下面的例子:
struct s1
; struct s2
; struct s3
; struct s4
; cout<
s1和s2大小雖然都是8,但是s1的對齊方式是1,s2是8(double),所以在s3和s4中才有這樣的差異。
所以,在自己定義結構體的時候,如果空間緊張的話,最好考慮對齊因素來排列結構體裡的元素。
c**:
struct u_a;
} b;
/* printf("%d/n", sizeof(b.n));//4
printf("%d/n", sizeof(b.s));//10
printf("%d/n", sizeof(b.u_a));//24
printf("%d/n", sizeof(b));//40*/
結論:struct 裡面的元素是順序儲存的,每個元素占用的位元組數根據對齊位元組數n(struct 裡占用位元組最多的元素與cpu對齊位元組數中較小的乙個)進行調整.如果從左至右m個元素加起來的位元組數大於n,則按從右至左捨去k個元素直至m-k個元素加起來的位元組數小於等於n,如果等於n則不用位元組填充,小於n則把m-k-1的元素填充直至=n.
mysql 大記憶體 記憶體頻寬對mysql影響多大?
網路是資料庫基礎架構的主要部分。但是,通常效能基準測試是在本地計算機上完成的,客戶端和伺服器並置在一起。這樣做是為了簡化結構並排除乙個以上的變數 網路部分 但是我們也忽略了網路對效能的影響。對於像 mysql group replication 這樣的產品集群來說,網路更為重要。在這篇文章中,我將介...
struct class 和union記憶體對齊
基本資料型別所佔空間 unsigned無符號型別相同 大小足夠容納最寬的成員 大小能被其包含的所有基本資料型別的大小所整除。是被資料型別的大小 1,2,4,8,不是變數大小 方法 記憶體大小只取決於最大的成員 找到佔空間最大的成員,取最大的空間值x 當x無法被所有的資料型別大小所整除,就補加a,使得...
關於記憶體對其問題 三
第一種情況 struct bbb long num 4bytes char name 4 bytes short int data 2 bytes char ha 1 byte short ba 5 10 bytes sizeof bbb 24bytes 理由 1.很容易知道bbb的記憶體對齊數是4...