30
struct a
{
    char *c;
    char b;
};

什么是 sizeof(a)?

4

8 回答 8

34
#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}

我在 32 位机器上得到“sizeof(a) == 8”。结构的总大小将取决于打包:在我的情况下,默认打包为 4,因此“c”占用 4 个字节,“b”占用一个字节,留下 3 个填充字节以将其带到下一个 4 的倍数: 8. 如果你想改变这个包装,大多数编译器都有改变它的方法,例如在 MSVC 上:

#pragma pack(1)
typedef struct { char* c; char b; } a;

给出 sizeof(a) == 5。如果这样做,请注意在任何库头文件之前重置打包!

于 2008-09-27T05:13:06.863 回答
9

与其他一些答案所说的相反,在大多数系统上,在没有编译指示或编译器选项的情况下,结构的大小将至少为 6 个字节,在大多数 32 位系统上,为 8 个字节。对于 64 位系统,大小很容易达到 16 字节。对齐确实起作用了。总是。单个结构的大小必须使得可以分配具有这些大小的数组,并且数组的各个成员对于所讨论的处理器来说是充分对齐的。因此,如果结构的大小如其他人所假设的那样为 5,则由两个此类结构组成的数组将是 10 字节长,并且第二个数组成员中的 char 指针将在奇数字节上对齐,这将(在大多数情况下)处理器)导致性能的主要瓶颈。

于 2008-09-27T05:10:18.603 回答
5

如果你想手动计算它,结构的大小只是考虑对齐后它的每个数据成员的大小。结构没有神奇的开销字节。

于 2008-09-27T05:21:41.307 回答
2

确切的值是sizeof(a)
您也可能冒险并假设在这种情况下不小于 2 且不大于 16。

于 2008-09-27T05:09:58.043 回答
1

这将取决于您的架构以及它如何处理基本数据类型。它还取决于系统是否需要自然对齐。

于 2008-09-27T05:04:36.107 回答
0

我假设您的意思是结构而不是严格,但在 32 位系统上,它将是 5 或 8 个字节,具体取决于编译器是否填充结构。

于 2008-09-27T05:00:56.863 回答
0

我怀疑您的意思是“结构”,而不是“严格”,以及“字符”而不是“字符”。

大小将取决于实现。在大多数 32 位系统上,指针可能为 5 - 4 个字节,字符为 1 个字节。我不相信对齐会在这里发挥作用。但是,如果您交换了“c”和“b”,则大小可能会增长到 8 个字节。

好的,我试了一下(g++ 4.2.3,带有 -g 选项),我得到了 8。

于 2008-09-27T05:02:58.480 回答
0

在 32 位系统上,结构的大小应该是 8 个字节,这样结构的大小就会变成 2 的倍数。这使得在声明结构数组时各个结构在正确的字节边界处可用。这是通过在结构末尾填充 3 个字节来实现的。

如果结构在 char 之后声明了指针,则它的大小仍为 8 字节,但将添加 3 字节填充以使指针(这是一个 4 字节元素)与 4 字节地址边界对齐。

经验法则是元素的偏移量应该是它们字节大小的倍数,并且结构本身的大小应该是 2 的倍数。

于 2008-09-27T05:17:39.210 回答