这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排...
c和d成员大小都为1字节,根据规则一要对齐到1字节,所以c偏移为9,d偏移为10 四个成员目前所占用的空间加起来是10字节,但是!此时还没完!根据规则二结构体的总大小为结构内最大成员的整数倍,test_t这个结构内最大成员是b占用4字节,所以10字节还要补齐2字节去对齐4字节,所以sizeof(test_t)=12。 示例二: 现在...
第二条:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员大小的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。 第三条:结构体总大小是包括填充字节,最后一个成...
5、对于大小为8字节的变量,要求其在结构体的位置为8的倍数,也会对其右边多出七个字节的占用,但是不会多出七个字节的内存,只是在内存的右边多出七个字节的位置而已。 6、C中的枚举常量和指针类型都会进行字节对齐,枚举常量和指针类型都会被当做int类型来对齐,即按照4个字节的方式对齐。 7、C语言中,数组也会进...
由此可以轻易的计算出,AAA占36个字节,同理,很容易计算出BBB占32个字节空间。 2、字节对其的情况下,可以更高效的访问 假设一个结构体的数据如下存储: --- | 12 | 34 | 56 | 78 | ---(A) --- --- | XX | YY
1)数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。 2)结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。 3)指定对齐值:#pragma pack (value)指定对齐值 value。 4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,...
处理器间通过消息(对于C/C++而言就是结构体)进行通信时,需要注意字节对齐以及字节序的问题。 大多数编译器提供内存对其的选项供用户使用。这样用户可以根据处理器的情况选择不同的字节对齐方式。例如C/C++编译器提供的#pragma pack(n) n=1,2,4等,让编译器在生成目标文件时,使内存数据按照指定的方式排布在1,2,...
比如32位的Intel处理器通过总线访问(包括读和写)内存数据。每个总线周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,那么处理器就需要2个总线周期对其进行访问,显然访问效率下降很多。 因此,通过合理的内存对齐可以提高访问效率。为使CPU能够对数据进行...
假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作. ...
用#pragma pack (1)将STRUCT_T定义为1字节对齐方式。 3.1.3.2 处理器间数据通信 处理器间通过消息(对于C/C++而言就是结构体)进行通信时,需要注意字节对齐以及字节序的问题。 大多数编译器提供内存对其的选项供用户使用。这样用户可以根据处理器的情况选择不同的字节对齐方式。例如C/C++编译器提供的#pragma pack(...