結構體成員的對齊方式
阿新 • • 發佈:2019-02-09
我們都知道每種資料型別佔有的記憶體空間大小都是明確,比如:char型別佔一個位元組,int型別佔4個位元組等等。我們可以通過使用sizeof關鍵字得到各種資料型別的長度:
例如:sizeof(char);//佔1個位元組
sizeof(int); //佔4個位元組
sizeof(short); //佔2個位元組
sizeof(double); //佔8個位元組
對於結構體來說,結構體也是一種資料型別,接下討論關於結構體型別佔記憶體空間的大小:
例如下面的程式:
#include<iostream> using namespace std; struct STR { char i; int j; short k; double m; int n; char l; }; int main() { STR x; cout<<sizeof(char)<<endl; cout<<sizeof(int)<<endl; cout<<sizeof(short)<<endl; cout<<sizeof(double)<<endl; cout<<"sizeof(STR)="<<sizeof(STR)<<endl; return 0; }
當提及結構體型別所佔記憶體空間的時候,通常我們都會將結構體中定義的型別各自所佔的位元組數加起來;一般來說,則上述結構體中的位元組數應該為:1+4+2+8+4+1=20個
但是對於結構體,這種求記憶體空間大小的方法正確嗎?可能此時內心很矛盾,到底是對還是錯?答案是:錯的。內心是不是很崩潰!!!有圖有真相:
從上圖可以看出針對上面程式中定義的結構體實際上是佔32個位元組,,為什麼會是這種結果呢?
結構體成員是有一種預設的對齊的方式的:在本例中,結構體中的char,int,short為與double對齊,所以必須要湊夠8個位元組,char,int佔了8個位元組,為對齊所以short也佔了8位元組,下面int和char也湊夠了8位元組,所以共佔了32個位元組。