聲明一個結構體的時候,由於考慮到內存的對齊。例如,int型的變量,須要4個字節,那麼它在存儲的時候就須要在地址可以被4個字節整除的地方開始申請。node
例如咱們申請下面這樣的一個結構體:優化
struct{ char a; int b; char c; } node1;
在內存分配的時候,char佔一個字節,int 佔四個字節。spa
c語言在進行內存分配的時候,須要根據最大的寬度來進行分配。如咱們例子中,int須要4個字節,在分配char型的時候,雖然char只佔用一個字節,可是也須要從4個字節的位置開始分配。code
分配的內存以下:blog
a | - | - | - | b | c | - | - | - |
a分配結束後,要自動填充3個字節,再分配b,而後是c,再自動填充3個字節。內存
因此node1這個結構體的寬度是12get
咱們儘可能把對邊界要求嚴格的字段放在前面,要求弱的放在後面(強弱就是相對於寬度對齊來講):string
struct{ int b; char a; char c; } node1;
b | a | c | - | - |
這樣,先分配int,再分配char,雖然每次申請4個字節,可是最後的長度倒是8,所以節省了33%的地址空間。io
// test1107.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include "stdio.h" #include "string.h" typedef struct{ int b; char a; char c; } node1; typedef struct{ char a; int b; char c; } node2; int main(){ printf("%d\n",sizeof(char)); printf("%d\n",sizeof(int)); node1 n1; node2 n2; printf("%d %d\n",sizeof(n1),sizeof(n2)); getchar(); return 0; }
最後輸出:table
1
4
8 12