總體上遵循兩個原則:
(1)整體空間是 占用空間最大的成員(的型別)所佔位元組數的整倍數
(2)資料對齊原則
----
記憶體按結構成員的先後順序排列,當排到該成員變數時,其前面已擺放的空間大小必須是該成員型別大小的整倍數,如果不夠則補齊,以此向後類推。。。。。
注意:陣列按照單個變數乙個乙個的擺放,而不是看成整體。如果成員中有自定義的類、結構體,也要注意陣列問題。
例:[引用其他帖子的內容]
因為對齊問題使結構體的sizeof變得比較複雜,看下面的例子:
(預設對齊方式下)
struct s1
char a;
double b;
int c;
char d;
struct s2
char a;
char b;
int c;
double d;
coutint型別,乙個
double
型別,但是因為對齊問題,導致他們的大小不同。計算結構體大小可以採用元素擺放法,我舉例子說明一下:首先,
cpu判斷結構體的對界,根據上一節的結論,s1和
s2的對界都取最大的元素型別,也就是
double
型別的對界
8。然後開始擺放每個元素。
對於s1,首先把a放到
8的對界,假定是01
,但是下乙個元素d是
double
型別,要放到
8的對界上,離
1最接近的位址是
8了,所以
d被放在了816
,下乙個元素
c的對界是4,
16可以滿足,所以
c放在了
1620
,下乙個元素
d需要對界
1,也正好落在對界上,所以
d放在了
20,結構體在位址
21處結束。由於
s1的大小需要是
8的倍數,所以
21-23
的空間被保留,
s1的大小變成了24。
對於s2,首先把a放到
8的對界,假定是01
,下乙個元素的對界也是
1,所以
b擺放在12
;下乙個元素
c的對界是
4,所以取離
2最近的位址4擺放
c8,下乙個元素
d的對界是
8,所以
d擺放在
8,所有元素擺放完畢,結構體在
15處結束,占用總空間為
16,正好是
8的倍數。
這裡有個陷阱,對於結構體中的結構體成員,不要認為它的對齊方式就是他的大小,看下面的例子:
struct s1
char a[8];
struct s2
double d;
struct s3
s1 s;
char a;
struct s4
s2 s;
char a;
couts2大小雖然都是
8,但是
s1的對齊方式是1,
s2是8(
double
),所以在s3和
s4中才有這樣的差異。
所以,在自己定義結構體的時候,如果空間緊張的話,最好考慮對齊因素來排列結構體裡的元素。
補充:不要讓double干擾你的位域
在結構體和類中,可以使用位域來規定某個成員所能占用的空間,所以使用位域能在一定程度上節省結構體占用的空間。不過考慮下面的**:
struct s1
int i: 8;
int j: 4;
double b;
int a:3;
struct s2
int i;
int j;
double b;
int a;
struct s3
int i;
int j;
int a;
double b;
struct s4
int i: 8;
int j: 4;
int a:3;
double b;
coutsizeof
的演算法參考上一節),所以使用位域的的時候,最好把
float
型別和double
型別放在程式的開始或者最後。
sizeof int:4
sizeof short:2
sizeof long:4
sizeof float:4
sizeof double:8
sizeof char:1
sizeof p:4
sizeof word:2
sizeof dword:4
union 與struct的空間計算
一 x86 總體上遵循兩個原則 說明 假定結構體是從位址0開始依次存放各個變數的 struct s1 student 詳細解釋 sizeof 用法彙總 為什麼會有這樣的規定呢?這一定與處理器的字長有關 處理器一次訪問資料的寬度 和編譯器對結構體變數的處理有關。不幸的是,本人對x86架構不甚熟悉,只能...
struct和union在記憶體中占用空間大小的計算
資料型別 32位系統 64位系統 bool 1位元組1位元組 char 1位元組1位元組 short 2位元組2位元組 int4位元組 4位元組long 4位元組8位元組 long long 8位元組8位元組 float 4位元組4位元組 double 8位元組8位元組 long double 12...
union 和 struct 的區別與聯絡
union 共用體 構造資料型別,也叫聯合體 用途 使幾個不同型別的變數共佔一段記憶體 相互覆蓋 struct 結構體 是一種構造型別 用途 把不同的資料組合成乙個整體 自定義資料型別 主要區別 1.struct和union都是由多個不同的資料型別成員組成,但在任何同一時刻,union中只存放了乙個...