2

当我运行以下时,它给我的输出为 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));
}
4

5 回答 5

4

由于几个原因(指令集架构、生成代码的性能、ABI一致性......),编译器正在做一些数据填充

您也许可以使用 GCC __attribute__((packed))(如果使用GCC或像CLANG这样的兼容编译器)来避免这种情况(存在代码变慢和与调用库不一致的风险)。通常避免打包你的数据结构,如果可能的话,通过减少对齐来排列其中的字段。另见__alignof__GCC。

于 2013-08-10T04:05:46.653 回答
4

它是地址对齐

看 :

诠释 4

char 10 ==> 12 用于对齐

浮动 4

喜欢 :

iiii
cccc
cccc
cc^^  <-- a data pading to make address alignment.
ffff

共 20 个

于 2013-08-10T04:05:55.260 回答
2

首先,它将是 18,而不是 16。其次,允许编译器向结构添加填充,通常用于相关平台的对齐要求。

于 2013-08-10T04:07:34.677 回答
1

发生的事情称为数据结构对齐,或者通常在两个密切相关的部分中讨论:数据对齐和数据填充。

为了使处理器能够读取字节,它需要设置为等于字大小块的某个倍数的内存偏移量(字大小块通常是存储整数所需的字节量),这是已知的作为数据对齐。数据填充是插入随机字节以具有适当偏移量的过程,该偏移量是字大小块的倍数。这可以在结构的中间或末尾完成,完全取决于编译器。

在 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 个字节)。编译器以性能换取空间效率。

于 2013-08-10T04:59:32.133 回答
0

这里 char 占用 2 个字节。这样做是为了减少该变量的访问时间。现在如何减少访问时间:阅读内存库,即偶数库和奇数库概念。如果你想让 char 占用一个字节,请使用#pragma pack。但在这样做之前先看看这个

于 2013-08-10T04:11:29.927 回答