struct 對齊機制和sizeof 筆記

2021-06-25 16:14:02 字數 782 閱讀 3783

32位機下:

struct test{

long long int t1;

char c;

int i;

char arr[2];

static int iv;

int test::iv=0;

求sizeof(test).

如果你考慮的是在vc/vs環境下,你的答案不是24,請繼續往下看:

如果你考慮的是在gcc/g++編譯環境下,你的答案不是16,請繼續往下看:

long long int :8位元組

char: 1位元組

int :4位元組

char 陣列:2位元組

static資料放置在全域性區,不算入該結構體的大小中。

vc編譯器下:struct的成員按照宣告的順序分配記憶體,並且某型別的起始位址必須能被該型別所佔位元組數整除。struct 的對齊方式是按照最寬位元組的成員的位元組數對齊,所以該結構體按8位元組對齊,所以是:

8位元組(long)

1(char)+3位元組(補齊)  4位元組(int)

2位元組(char arr)+6位元組(補齊)

所以一共是24位元組

而在gcc/g++編譯器下,struct的成員並不一定按照宣告順序分配記憶體,而是做了一定的優化。首先存位元組較寬的成員比如long long,int。對齊方式仍是按照最寬位元組的成員的位元組數對齊。所以記憶體情況應為如下:

8位元組(long long)

4位元組(int)  1位元組 (char) 2位元組(char arr)  1位元組(補齊)

所以一共是16位元組。

struct自然對齊和指定對齊

intel 微軟等公司曾經出過一道類似的面試題 include pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 答案是 816 4解釋 程式中第2行 pragma pack 8...

關於Union和Struct對齊

關於union,struct,還有機器數賦值,總是感覺自己認識不是特別深刻,這裡使用小demo程式加以說明,具體的詳細細節描述其它地方已經有說明和記錄,這裡不再說明。include union myun u int k a int main output size is 12 0 5 6 說明 in...

struct的用法和struct的對齊原則

struct在c語言中作為結構體。結構體定義 struct stu 使用 struct stu a 或者省略關鍵字struct stu a 也可以定義和使用同時 struct stu a 在後續使用中,出現結構體型別的地方都可以在前面加struct,用來提醒別人這個型別是自定義結構體 當然也可以省略...