当我运行以下时,它输出为20。 但int为4字节,float为4字节,字符数组为10字节,则总数为18字节。为什么我输出为20字节?
#include<stdio.h>
struct emp
{
int id;
char name[10];
float f;
}e1;
main()
{
printf("\n\tSize Of Structure is==>%d\n",sizeof(e1));
}
答案 0 :(得分:4)
由于多种原因(instruction set architecture,生成代码的性能,ABI一致性......),编译器正在做一些data padding。
你也许可以使用GCC __attribute__((packed))
(如果使用GCC或兼容的编译器,如CLANG)来避免这种情况(存在代码更慢和不符合被调用库的风险) )。通常,请避免打包数据结构,如果可能,请通过减少对齐来排序字段。另见GCC中的__alignof__
。
答案 1 :(得分:4)
见:
int 4
char 10 ==&gt; 12用于对齐
浮4
喜欢:
iiii
cccc
cccc
cc^^ <-- a data pading to make address alignment.
ffff
总共20
答案 2 :(得分:2)
首先,它将是18,而不是16.其次,允许编译器向结构添加填充,通常用于相关平台的对齐要求。
答案 3 :(得分:1)
正在发生的事情被称为data structure alignment,或者在两个密切相关的部分中经常讨论:数据对齐和数据填充。
为了使处理器能够读取字节,需要将其设置为等于字大小块的某个倍数的存储器偏移量(字大小块通常是存储整数所需的字节数),这称为数据对齐。数据填充是插入随机字节以具有与字大小块的倍数的适当偏移的过程。这可以在结构的中间或结尾完成,完全由编译器完成。
在32位环境中考虑以下示例。看看你的结构:
struct emp {
int id;
char name[ 10 ];
float f;
};
如果您要创建一个新结构,可以在内存中看到如下:
1. (byte for integer)
2. (byte for integer)
3. (byte for integer)
4. (byte for integer)
5. (byte for char)
6. (byte for char)
7. (byte for char)
8. (byte for char)
9. (byte for char)
10. (byte for char)
11. (byte for char)
12. (byte for char)
13. (byte for char)
14. (byte for char)
15. ***(padding byte)***
16. ***(padding byte)***
17. (byte for float)
18. (byte for float)
19. (byte for float)
20. (byte for float)
<强>注:强>
[x]它可以存储一个没有任何填充的整数。
[x]它可以为10个字符的数组存储10个字节。
请注意,前两个字段的字节数已经计算为14个字节,这不是字大小块4的倍数。编译器然后插入正确的字节偏移量。
[x]它存储两个用于偏移14和4的随机字节。
[x]它为浮点数存储了四个字节。
...因此emp
结构所需的字节数是20个字节(而不是最初的18个字节)。编制者正在为空间效率进行交易。
答案 4 :(得分:0)
这里char占用2个字节。这样做是为了减少该变量的访问时间。现在如何减少访问时间:了解存储库,即银行和奇数银行概念。如果你想使用#pragma pack使char占用一个字节。但在此之前,请先查看this