結構體大小計算方法
例項驗證
gcc更改對齊選項
char:1個位元組
char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組)
shortint :2個位元組
int: 4個位元組
unsigned int: 4個位元組
float: 4個位元組
double: 8個位元組
long: 4個位元組
long long: 8個位元組
unsigned long: 4個位元組
char:1個位元組
char*(即指標變數): 8個位元組
short int :2個位元組
int: 4個位元組
unsigned int: 4個位元組
float: 4個位元組
double: 8個位元組
long: 8個位元組
long long: 8個位元組
unsigned long: 8個位元組
① 計算有效對齊值 v = min(n, maxmembersize);
其中n為指定的編譯器選項,即#pragma pack(n)。如果沒有指定,gcc在32位系統上預設值是4,在64位系統上預設值是8;
maxmembersize為結構體中最大的基本型別成員變數的大小;
② 計算offset偏移量 offset = min(v, membersize);
其中membersize為當前成員的大小;如果當前成員也是結構體,那麼此時membersize按照該子結構體中最大基本型別成員變數的大小;
③ 結構體的總大小必須為v的整數倍,即totalsize = n*v
#include
struct object
;struct object1
;struct object2
;int
main
(void
)
在32位上和64位上的執行結果分別為:
)在32位上和64位上的執行結果分別為:
可以通過使用gcc中的__attribute__選項來設定對齊大小。
_attribute_((packed))
用來讓所修飾的結構體在編譯的時候不進行對齊優化,按照實際占用的位元組數來使用。使用該項修飾後,該結構體後續都不會參與對齊。
_attribute_((aligned(n)))
讓所修飾的結構體成員按照n位元組對齊。32位平台上gcc預設按4位元組對齊;64位平台gcc預設按照8位元組對齊。
#include
#pragma pack(8)
struct example1
__attribute__
((packed));
//因為example1被__attribute__((packed))修飾了,所以在example2中則不再參與對齊操作
//所以v=min(4, 2) = 2
//offset = min(v, membersize)
//0 c
//1 obj1
//6 obj1
//7
//8 e
//9 e
//totalsize = 10
struct example2
;#pragma pack()
intmain
(void
)
在32位平台上執行結果為:
size of struct example1 is 6size of struct example2 is 10
offset is 1
結構體大小的計算方法
結構體在春村過程中會有 記憶體對齊 的要求。在計算結構體大小的時候,謹記兩條規則 1 上面定義的常量或者變數型別占用的記憶體大小是下面定義的倍數 2 計算出的最終值能否整除當前結構體中最大的資料型別。計算下列結構體的大小 1 struct a 8 int 型別的常量占用4個位元組,兩個int型的占用...
結構體大小計算方法
原文 結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 實際上,由於儲存變數時位址對齊的要求,編譯器在編譯程式時...
結構體字長計算方法
計算方法 運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小...