C语言中关于结构体的内存对齐
以前没太总结,今天看飞卡的书偶然看到的一个关于嵌入式C结构体的知识,赶紧来记录下,方便以后忘记了再次查阅。
1、自然对齐
两个原则:
1、各个类型偏移量必须是自身所占字节数的整数倍。
(譬如,int占4字节,它的偏移量也必须是4的倍数)
2、总的大小必须为该结构体中最大内存的整数倍,不够需要补充。
对了,忘了解释这个偏移量的概念了。变量的存放地址相对于结构起始地址的偏移量。
单独谈及概念的话,也许比较难受,那么直接上代码吧。
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
double a;
char b;
int c;
}mystruct;
int main()
{
printf("%d\n", sizeof(mystruct));
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
答案: 8+1+3+4= 16
这么加,什么意思呢?
莫急,且听我细细道来。
我不是前面说了两条金科玉律了嘛?比照着来。
第一条,每个类型的偏移量是自身所占字节的整数倍。第一个类型是double,偏移量是0,自身所占字节8。符合条件。
然后就是char,自身所占字节1,偏移量8。符合条件。
接着int,自身所占字节4,偏移量为9的话,不符合4的倍数这个条件。
应空出3个字节,让偏移量为12,此时满足4的倍数。
那么此时对应的结果为:8+1+3+4 = 16
对了,还要验证一下是否符合第二条,满足最终答案是最大字节数的整数倍。故答案就是16咯。
那么接下来再看一个:
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
char b;
double a;
int c;
}mystruct;
int main()
{
printf("%d\n", sizeof(mystruct));
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
char和double换了一下位置呢,
答案:1+7+8+4+4 = 24
emmm,,, 也许参照前面的你算出的答案可能是20,为啥还要+4啊,别忘了第二条玉律,必须是8的倍数,只能加4。
2、自定义对齐
使用#pragma pack(n),也是两条规矩:
自身所占字节小于n,按照默认的对齐方式
自身索赞字节大于n,那么偏移量必须是n的整数倍。
还不清楚?没关系,看代码!
#include <stdio.h>
#include <stdlib.h>
#pragma pack(push)
#pragma pack(4)
struct MyStruct
{
char b;
double a;
int c;
}mystruct;
#pragma pack(pop)
int main()
{
printf("%d\n", sizeof(mystruct));
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
猜,答案会是多少?
答案: 1+3+8+4 = 16
和刚才的24有区别吧,,
学会了吧,,哈哈哈。。。
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/79143668
- 点赞
- 收藏
- 关注作者
评论(0)