【杂谈】结构体的内存对齐与位段
目录一、结构体内存对齐问题节省时间1.什么是内存对齐2.需要使用内存对齐的原因3.内存对齐的规则4.举例5.小结二、结构体实现位段操作节省空间1.位域简介与使用原因2.位域的定义与使用时的注意事项3.举例4.工程应用一、结构体内存对齐问题节省时间1.什么是内存对齐内存对齐Memory Alignment是指编译器将结构体的每个成员放置在内存中特定位置的过程以提高CPU访问内存的效率。它会在成员之间插入“填充字节”padding使得每个成员的起始地址满足一定的对齐要求。2.需要使用内存对齐的原因硬件要求许多CPU架构如RISC、x86要求特定类型的数据必须存放在特定地址上否则会引发硬件异常如总线错误或性能急剧下降。例如32位CPU通常要求int类型的数据地址是4的倍数。访问效率即使某些CPU允许非对齐访问如x86但访问对齐的数据通常更快可能一次内存访问即可完成而非对齐可能需要两次内存访问并拼接数据。原子性保证对齐的数据可以保证原子操作在某些平台上非对齐可能导致操作被拆分。3.内存对齐的规则确定起点结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处确定其他成员对齐位置其他成员变量要对齐到对齐数的整数倍的地址处对齐数编译器默认的⼀个对齐数与该成员变量大小的较小值。VS 编辑器中默认的对齐数为 8Linux中gcc没有默认对齐数对齐数就是成员自身的大小确定总大小结构体总大小为最大对齐数结构体中每个成员变量都有一个对齐数所有对齐数中最大的的整数倍嵌套问题如果嵌套了结构体的情况嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体中成员的对齐数的整数倍。4.举例5.小结在设计结构体的时候我们既要满足对齐又要节省空间那么就要让占用空间小的成员尽量集中在⼀起二、结构体实现位段操作节省空间1.位域简介与使用原因位域允许我们将结构体成员按位bit分配空间适用于需要精确控制位数、节省内存的场景如硬件寄存器、网络协议头等2.位域的定义与使用时的注意事项定义在成员后加冒号和位数struct Flags { unsigned int a : 1; // a 占1位 unsigned int b : 2; // b 占2位 unsigned int c : 3; // c 占3位 };注意事项位域成员必须是无符号或有符号整数类型int、unsigned int等。不能对位域成员取地址。struct A { int _b : 5; int _c : 10; int _d : 30; }; int main() { struct A sa {0}; //错误示范 scanf(%d, sa._b); //正确的示范 int b 0; scanf(%d, b); sa._b b; return 0; }位域的总位数不能超过底层类型的位数通常为unsigned int的位数如32位。位段中的成员在内存中从左向右分配还是从右向左分配标准尚未定义。当一个结构包含两个位段第二个位段成员比较大无法容纳于第一个位段剩余的位时是舍弃剩余的位还是利用标准尚未定义。3.举例4.工程应用网络协议中IP数据报的格式我们可以看到其中很多的属性只需要几个bit位就能描述这里使用位段能够实现想要的效果也节省了空间这样网络传输的数据报大小也会较小一些对网络的畅通是有帮助的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412016.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!