C语言中字节对齐问题
2017-09-26 23:19
239 查看
以前设计结构体时,都是随性定义子成员,没有考虑字节对齐对内存空间的影响。现在从事的是嵌入式开发,对设备的内存空间利用要求非常严格,经常一不小心Code量就超出芯片容量,所以平时如果自己养成好的习惯,注意字节对齐,可以节省好多空间。
之前不明白为什么ALIGN2占用八个字节,通过调试发现的确是占用八个字节,查阅书籍,《C和指针》有说明,所有的结构起始存储位置必须是结构中边界要求最严格的数据类型,例子中第一个是int(认为机器的整型值是4个字节),后续必须也按四个对其,虽然后面的是两个char类型,只占用两个字节,但是依然按照四个来对其,所以占用八个字节。
如果定义成
这个结构体将占用12个字节,前面的定义只占用8个字节,整整节省了1/3的空间。在编码时多注意细节,才能写出高效的代码。
#include <stdlib.h> #include <stdio.h> #include <stddef.h> struct ALIGN2 { int a; char b; char c; }; int main(void) { struct ALIGN2 ex; ex.b = 0; ex.a = 1; ex.c = 2; printf("the num is %d\r\n",offsetof(struct ALIGN2 ,a)); printf("the num is %d\r\n",offsetof(struct ALIGN2 ,b)); printf("the num is %d\r\n",offsetof(struct ALIGN2 ,c)); return 0; }
之前不明白为什么ALIGN2占用八个字节,通过调试发现的确是占用八个字节,查阅书籍,《C和指针》有说明,所有的结构起始存储位置必须是结构中边界要求最严格的数据类型,例子中第一个是int(认为机器的整型值是4个字节),后续必须也按四个对其,虽然后面的是两个char类型,只占用两个字节,但是依然按照四个来对其,所以占用八个字节。
如果定义成
struct ALIGN2 { char a; int b; char c; };
这个结构体将占用12个字节,前面的定义只占用8个字节,整整节省了1/3的空间。在编码时多注意细节,才能写出高效的代码。
相关文章推荐
- C语言字节对齐问题详解
- C语言字节对齐问题详解(对齐、字节序、网络序等)
- 字节对齐问题(C语言)
- 个人对C语言字节对齐问题的一些见解
- 关于C语言中结构体字节对齐问题
- C语言字节对齐问题详解
- 【C语言】字节对齐问题(以32位系统为例)
- C语言字节对齐问题详解(zz)
- C语言编程中的字节对齐问题
- C语言字节对齐问题
- <C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
- c语言中内存字节对齐问题
- c语言编程中字节对齐的问题
- C语言字节对齐问题综合
- C语言字节对齐问题详解
- C语言字节对齐问题
- 关于c语言中的字节对齐padding问题
- [memory]C语言关于字节对齐的问题
- <C/C++>C语言字节对齐问题总结
- C语言字节对齐问题详解