結構體大小的計算方法

2021-10-02 16:19:49 字數 2178 閱讀 9517

結構體大小計算方法

例項驗證

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 6

size 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語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小...