c语言字节强制对齐,C语言的那些小秘密之字节对齐
為了讓讀者加深印象,我們這里在代碼中沒有使用0,而是使用的4,所以在最終計算出的結果部分減去了一個4才是偏移地址,當然實際使用中我們都是用的是0。
懂了上面的宏offsetof之后我們再來看看下面的代碼:
#include?
#define?offsetof(TYPE,?MEMBER)?((size_t)?&((TYPE?*)0)->MEMBER)
typedefstructstu1
{
inta;
charb[1];
intc;
}stu1;
voidmain()
{
printf("offsetof(stu1,a):\t%d\n",offsetof(stu1,a));
printf("offsetof(stu1,b):\t%d\n",offsetof(stu1,b));
printf("offsetof(stu1,c):\t%d\n",offsetof(stu1,c));
printf("sizeof(stu1)????:\t%d\n",sizeof(stu1));
}
運行結果為:
offsetof(stu1,a):???????0
offsetof(stu1,b):???????4
offsetof(stu1,c):???????8
sizeof(stu1)????:???????12
Press?any?key?tocontinue
對于字節對齊不了解的讀者可能有疑惑的是c的偏移量怎么會是8和結構體的大小怎么會是12呢?因該是sizeof(int)+sizeof(char)+sizeof(int)=9。其實這是編譯器對變量存儲的一個特殊處理。為了提高CPU的存儲速度,編譯器對一些變量的起始地址做了對齊處理。在默認情況下,編譯器規定各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節數的倍數。現在來分析下上面的代碼,如果我們假定a的起始地址為0,它占用了4個字節,那么接下來的空閑地址就是4,是1的倍數,滿足要求,所以b存放的起始地址是4,占用一個字節。接下來的空閑地址為5,而c是int變量,占用4個字節,5不是4的整數倍,所以向后移動,找到離5最近的8作為存放c的起始地址,c也占用4字節,所以最后使得結構體的大小為12。現在我們再來看看下面的代碼:
#include?
typedefstructstu1
{
chararray[7];
}stu1;
typedefstructstu2
{
doublefa;
}stu2;
typedefstructstu3
{
stu1?s;
charstr;
}stu3;
typedefstructstu4
{
stu2?s;
charstr;
}stu4;
voidmain()
{
printf("sizeof(stu1)????:\t%d\n",sizeof(stu1));
printf("sizeof(stu2)????:\t%d\n",sizeof(stu2));
printf("sizeof(stu3)????:\t%d\n",sizeof(stu3));
printf("sizeof(stu4)????:\t%d\n",sizeof(stu4));
}
總結
以上是生活随笔為你收集整理的c语言字节强制对齐,C语言的那些小秘密之字节对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表添加元素的三种方法定义集
- 下一篇: mysql 字符串 截取字母_MySQL