字节对齐

        存储的数据如果对齐边界,则存取速度较快,同时简化了处理器与内存之间传输系统的设计,就是基于这样的硬件设计就有C语言中结构体的边界对齐。CPU始终读取其字大小(32位处理器上的4个字节),因此当在支持它的处理器上执行未对齐的地址访问时 ,处理器将读取多个字。 CPU将读取请求地址可能跨越的每个内存字。因此,读取两个字节比四个字节更容易慢。

先上一道题目,用gcc编译,32位机(严格来说程序是32位还是64位程序是更如何编译有关的)

字节对齐_第1张图片

这道题的正确答案是C。

边界对齐的规则如下:

1.编译器按照结构体成员列表顺序给每个成员分配内存
2.当成员需要满足正确的边界对齐时,成员之间用额外字节填充

3.结构体的首地址必须满足结构体中边界对齐要求最为严格的数据类型所要求的首地址

4.结构体的大小为其最宽数据类型的整数倍

说明:从第一个成员开始,挨着分配,如果大于了最宽数据类型,则空置到下一个n*最宽数据类型开始

边界对齐是编译器优化的,除了自然对界外还有指定对

· 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;

· 使用伪指令#pragma pack (),取消自定义字节对齐方式。

 

C语言stddef.h头文件中定义了一个宏offsetof,可用于得到结构体成员存储位置相对于结构体首地址的偏移量,其原型为:offsetof(type,member),

 

你可能感兴趣的:(C/C++,操作系统)