程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言結構體對齊

C語言結構體對齊

編輯:關於C語言
 

1 結構體數據對齊(沒有#pragma pack()宏定義)

結構體對齊可以總結為三個基本原則

①數據成員對齊規則:

結構體的數據成員中,第一個成員從offset為0的地址開始,以後每一個成員存儲的起始位置為該成員大小的整數倍(在win32中int為32bit也即4字節對齊)

②結構體作為成員:

如果一個結構體1作為另一個結構體2的數據成員,則在結構體2中結構體1要從1內部成員最大的整數倍地址開始存儲。

③結構體的總大小(sizeof):

為該結構體內部最大基本類型的整數倍,不足的要補齊,而不是簡單的所有成員的大小總和。

舉例說明

struct{

short a;

short b;

short c; }A; sizeof(A) = 6;(vc6與gcc相同)

struct{

long a;

short c; }A; sizeof(A) = 8;(vc6與gcc相同),根據原則③

它的內存分配為: a1 a2 a3 a4 , c1 c2 x x(a1為a的第一個字節,x為補齊字節,下同)

struct{

int a;

char b;

short c; }A;

sizeof(A) = 8;

A的內存分配為: a1 a2 a3 a4, b1 x c1 c2(原則1)

struct{

char a;

int b;

short c; }A1;

sizeof(A1) = 12; (vc6與gcc相同)

A1的內存分配為: a1 x x x, b1 b2 b3 b4, c1 c2 x x

下面是更復雜的情況,結構體作為成員

struct{

int a;

doubl b;

short c; }A; // sizeof(A) = 24 (vc6與gcc相同)

struct{

char a,b;

int c;

double d;

short e;

struct A h;

}B;

sizeof(B) = 48 //(vc6與gcc相同)

A的內存分布: a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x

B的內存分布:a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x, A的分布

 

 

2 加入#pragma pack()宏定義)

#pragma pack(1)

上面的AB大小分別為14,30,對應於AB的內存分布,去掉x。

pack(2)時為14,30

pack(4)時為16,36

 

3 結構體的位域

結構體中引入位於是為了壓縮存儲空間。而且位於成員不能單獨計算sizeof。

位域大致有5條基本規則。

① 如果相鄰字段的類型相同,且位寬之和小於該類型的sizeof(), 則可以緊鄰著前一個字段存儲,直到不能在容納位置;

struct{

char a:2;

char b:4;

char c:5; }A; // sizeof(A) = 2

內存分布: a1 a2 x x, b1 b2 b3 b4, c1 c2 c3 c4 c5 x x x,這裡每一個代表一個bit,與上一節不同

struct{

int a:2;

int b:3;

int c:3; }A; // sizeof(A) = 4, 參照後面的原則5

 

②如果相鄰字段的類型相同,但是位寬之和大於該類型的sizeof(), 則後面的字段將從新的存儲單元開始存儲,且offset為其類型大小的整數倍;

struct{

char a:6;

char b:3;

char c:3; }A; // sizeof(A) = 2

struct{

int a:20;

int b:20;

int c:3; }A; // sizeof(A) = 8, 同時參照後面的原則5

 

③如果相鄰位域字段類型不同,各編譯器的處理不同,VC6不壓縮,GCC壓縮。

struct{

int a:4;

char b:1;

int c:3; }A;

sizeof(A) = 12, VC6

sizeof(A) = 4, gcc, 壓縮了為什麼不是3? 同時參照後面的原則5

 

④如果位域字段之間插入非位域字段,各編譯器的處理不同

struct{

int a:4;

char b;

int c:3; }A;

sizeof(A) = 12, VC6

sizeof(A) = 4, gcc, a1 a2 a3 a4 x x x x ,b1~b8, c1 c2 c3 x x x x x

 

struct{

char a:4;

char b;

char c:3; }A;

sizeof(A) = 3, VC6

sizeof(A) = 3, gcc,

 

⑤整個結構體的總大小為其最寬基本類型的整數倍。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved