struct結構體由於包含了不同的數據類型,而數據結構類型之間存在占用空間大小的問題,比如char型占用1字節,short int占用2字節,int、long int、指針、float占用4字節、double占用8字節(windows和linux中)。但計算機系統對基本數據類型可能允許地址做出了限制,要求某種類型的對象必須是2、4或8的倍數(為了簡化處理器和存儲系統之間的硬件設計——可以節省至少1根地址線)。
那麼對於給出的一個struct類型數據,我們如何判斷它占用多少空間呢?
很簡單!我們按照對齊原則即可做出正確判斷。但記住:即不是像某些教程說的用struct結構體中占用空間最大的那個變量的字節數乘以變量總數,也不是所有變量占用空間總和,然後補齊到占用最大空間變量所占用字節數的倍數。
那麼,到底如何計算呢?
舉個例子就明白了:
struct
{
int i;
char j;
int k;
char r;
int s;
}s;
sizeof s = ?
答案是20。
struct
{
int i;
char j;
char r;
int k;
int s;
}s;
sizeof s = ?
答案是16。
struct
{
double i;
char j;
char r;
int k;
int s;
}s;
sizeof s = ?
答案是20。
struct
{
double i;
char j;
int k;
char r;
int s;
}s;
sizeof s = ?
答案是24。
struct
{
double i;
char j;
short k;
char r;
short s;
}s;
sizeof s = ?
答案是16。
看出問題了嗎?計算機系統按照struct中除了double外的變量類型中最大占用空間的字節數對齊。所以才有了上述結果。注意char在被int變量隔離開的時候,1個char也占用4字節,但兩個char甚至4個char緊挨著存放時則均只占用4個字節(訪問char變量按1的倍數訪問,這樣看來,CPU和存儲器之間的地址線也不能減少,因為有可能訪問到某地址,其最後一位也是1)。