【问题标题】:Output of following code with integer, float, char variable [duplicate]带有整数,浮点数,字符变量的以下代码的输出[重复]
【发布时间】:2013-08-12 02:00:29
【问题描述】:

当我运行跟随时,它给我的输出是 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));
}

【问题讨论】:

  • 顺便说一句:在打印sizeof() 时,您可能需要考虑%zu,因为size_t 是它的返回类型。 size_t 的大小并不总是与 int 相同。

标签: c


【解决方案1】:

它是address alignment

见:

int 4

char 10 ==> 12 用于对齐

浮点数 4

喜欢:

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

总共 20 个

【讨论】:

    【解决方案2】:

    出于多种原因(instruction set architecture、生成代码的性能、ABI 一致性...),编译器正在执行一些data padding

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        发生的事情称为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 个)。编译器以性能换取空间效率。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-18
            • 2021-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-30
            相关资源
            最近更新 更多