天天看點

關于記憶體對齊

#include<stdio.h>

structs1

{

charch;

intb2;

}s2;

structs3

charc1;

structs1s;

charc2;

}s4;

intmain()

inta;

intxh[4];

printf("%d\n",sizeof(a));

printf("%d\n",sizeofa);

printf("%d\n",sizeof(int));

printf("%d\n",sizeofxh);

printf("%d\n",sizeofs2);

printf("%d\n",sizeofs4);

return0;

}

輸出:44416816

第一sizeof不是函數,

1、c語言中沒有可接受參數為類型的函數,

2、沒有哪一個函數可以沒有括号的接收參數

而書中的歸納有:

1、sizeof是運算符,可用于任何變量名、類型名或常量值,當用于變量名(不是數組名)或常量時,它不需要用圓括号。

2、它在編譯時起作用,而不是運作時。

3、注意結構體中的位元組填充,位元組的填充規則有:

1)結構體變量的首位址能夠被其最寬基本類型成員的大小所整除;

2)結構體每個成員相對于結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internaladding);

3)結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailingpadding)。

#pragmapack的基本用法為:#pragmapack(n),

n為位元組對齊數,其取值為1、2、4、8、16,預設是8,如果這個值比結構體成員的sizeof值小,那麼如果設為1的話,應該是完全符合了

該成員的偏移量應該以此值為準,即是說,結構體成員的偏移量應該取二者的最小值,假定設定1位元組對齊,那麼完全符合計算結果

例如:

#pragmapack(1)

charch;

charc1;

structs1s;

4441657

5還有一點要注意,“空結構體”(不含資料成員)的大小不為0,而是1。試想一個“不占空間”的變量如何被取位址、兩個不同的“空結構體”變量又如何得以區分呢于是,“空結構體”變量也得被存儲,這樣編譯器也就隻能為其配置設定一個位元組的空間用于占位了。//有的編譯器不通過,不允許定義空結構體,codeblock實作的是0,是一個灰色地帶,

6strlen:求有效長度,sizeof總體長度,

鑒于char*p="fddfgfdgfg";sizeof(p)=4;而指針指向的長度,可以用strlen()+1來擷取長度,

char數組的有效長度,用strlen,大小用sizeof();

7sizeof接受參數的時候運作,參數不會計算,

i=0;

printf("%d\n",sizeof(i+++(++i)));

printf("%d\n",i);

輸出0

輸出的大小是從裡面的參數類型最大的一個,傳回大小

繼續閱讀