【问题标题】:sizeof struct with union [duplicate]带有联合的sizeof结构[重复]
【发布时间】:2013-12-12 11:37:26
【问题描述】:

我对整个“数据对齐”的事情感到非常困惑:

#include <stdio.h>
int main(){
    struct st{
        int i,*p;
        char c;
        union { char type[4]; unsigned char d;} un; 
    };

    struct st s1={25,&a,'X',"asdf"};
    printf("sizeof s1 is %d",sizeof(s1));
    return 0;
}

由于数据对齐,我认为由于大小

int i : 4 bytes
int *p : 8 bytes
char c : 1 byte(+3)
union : 4 bytes

输出将是 20,但这会输出 sizeof s1 is 24! 为什么输出24?这是否与int *p有关,即8字节?

【问题讨论】:

  • sizeofstruct(分配给它的内存量)不一定是其各部分大小的总和。编译器可能会填充它的一部分(比您指出的要多)。或者它可能会将其四舍五入为 8 的倍数。例如,请参阅stackoverflow.com/questions/119123/…
  • 根据下面的答案,你应该把p的声明放在前面,或者检查你的编译器是否有相关的#pragmas。
  • @EricJablow:如果你把p放在前面,大小仍然是24。你可以自己检查。
  • 我作为原创提出的问题是关于 C++ 的,但它只涉及普通的旧数据,所以它涵盖了 C 的情况。

标签: c struct sizeof


【解决方案1】:

在您的系统上,指针是 8 个字节并与 8 个字节对齐。

1 2 3 4 5 6 7 8 +---+---+---+---+---+---+---+---+ |诠释我 | [垫] | +---+---+---+---+---+---+---+---+ 9 10 11 12 13 14 15 16 +---+---+---+---+---+---+---+---+ |整数 *p | +---+---+---+---+---+---+---+---+ 17 18 19 20 21 22 23 24 +---+---+---+---+---+---+---+---+ | c |联合国 | [垫] | +---+---+---+---+---+---+---+---+

当然,如果不了解 ABI,您就无法确定确切的布局。以上只是一个例子。

【讨论】:

    【解决方案2】:

    在您使用的架构上,int *p 是 8 字节,但也需要位于 8 字节边界上。这为您提供了ip 之间的 4 个字节填充。此外,由于int *p 需要位于 8 字节边界上,因此整体结构需要是 8 字节的倍数,以便它们的数组始终与p 正确对齐。

    所以,你最终会得到这样的布局:

    • i:4字节,对齐4
    • 填充:4 个字节
    • p:8字节,对齐8
    • c: 1 个字节
    • un:4 个字节(因为它可以保持字节对齐)
    • 填充:3 字节(将其四舍五入到 8 字节边界)

    【讨论】:

    • 所以在所有结构中,大小是否总是向上舍入到最大的部分?
    • 这取决于很多事情。
    • @user3093640 :在我使用过的架构中,struct 的对齐方式通常与struct 的最严格成员的对齐方式相匹配。不过,它是实现定义的。长度和对齐要求并不总是匹配:例如在 32 位 x86 上,long long 类型是 8 个字节,但只有 4 个字节的对齐要求。
    猜你喜欢
    • 2020-05-30
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多