c语言中的边界对齐
2018-03-21 21:25
274 查看
存储的数据如果对齐边界,则存取速度较快,同时简化了处理器与内存之间传输系统的设计,就是基于这样的硬件设计就有C语言中结构体的边界对齐。
先上一道题目,用gcc编译,32位机(严格来说程序是32位还是64位程序是更如何编译有关的)
这道题的正确答案是C。
边界对齐的规则如下:
1.编译器按照结构体成员列表顺序给每个成员分配内存
2.当成员需要满足正确的边界对齐时,成员之间用额外字节填充
3.结构体的首地址必须满足结构体中边界对齐要求最为严格的数据类型所要求的首地址
4.结构体的大小为其最宽数据类型的整数倍
说明:从第一个成员开始,挨着分配,如果大于了最宽数据类型,则空置到下一个n*最宽数据类型开始
除了自然对界外还有指定对界
· 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
C语言stddef.h头文件中定义了一个宏offsetof,可用于得到结构体成员存储位置相对于结构体首地址的偏移量,其原型为:offsetof(type,member),
先上一道题目,用gcc编译,32位机(严格来说程序是32位还是64位程序是更如何编译有关的)
这道题的正确答案是C。
边界对齐的规则如下:
1.编译器按照结构体成员列表顺序给每个成员分配内存
2.当成员需要满足正确的边界对齐时,成员之间用额外字节填充
3.结构体的首地址必须满足结构体中边界对齐要求最为严格的数据类型所要求的首地址
4.结构体的大小为其最宽数据类型的整数倍
说明:从第一个成员开始,挨着分配,如果大于了最宽数据类型,则空置到下一个n*最宽数据类型开始
除了自然对界外还有指定对界
· 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
C语言stddef.h头文件中定义了一个宏offsetof,可用于得到结构体成员存储位置相对于结构体首地址的偏移量,其原型为:offsetof(type,member),
相关文章推荐
- C语言结构中的边界对齐问题
- C语言中sizeof用法中关于边界对齐的问题
- c语言结构体边界对齐
- C语言字节对齐
- C语言深入学习系列+-+字节对齐and内存管理
- c#编程指南(十二) 平台调用P-INVOKE完全掌握, 结构体边界对齐和内存布局
- C语言对齐问题
- 解析C语言结构体对齐(内存对齐问题)
- C结构体边界对齐2
- C语言结构体的对齐原则
- 深入C语言之字节对齐
- C语言 printf 格式化 输出 右对齐补零
- C语言字节对齐
- 第19讲----项目2 C语言中的字符对齐
- C语言:数据对齐
- C语言内存分配问题和 C语言中的内存对齐
- C语言字节对齐
- c语言对齐2
- 解析C语言中的sizeof ,重点介绍内存对齐
- C 结构体边界对齐规则