如何找到结构的大小? [关闭]

Posted

技术标签:

【中文标题】如何找到结构的大小? [关闭]【英文标题】:How do I find the size of a struct? [closed] 【发布时间】:2010-09-13 16:03:55 【问题描述】:
struct a

    char *c;
    char b;
;

什么是sizeof(a)?

【问题讨论】:

sizeof (a) 不是有效的 C。但它在 C++ 中仍然有效。 【参考方案1】:

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

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

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

【讨论】:

相对不常见,但仅包含 char 数组的结构可能具有奇数大小:struct unusual char a[3]; char b[4]; ; 的大小可能为 7,而不会造成任何不良影响。编译器可能仍会将其填充到 8 个字节,但显然没有必要这样做。【参考方案2】:

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

【讨论】:

虽然理论上没有上限,因为指针的实现和大小是编译器特定的,只要它们的行为符合标准。【参考方案3】:

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

【讨论】:

【参考方案4】:
#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。如果这样做,请注意在任何库头文件之前重置打包!

【讨论】:

确保它有效:printf("sizeof(a) == %d", (int)sizeof(a));´ @ThomasPadron-McCarthy 而是printf("%zu", sizeof(a))... @H2CO3:是的,这在足够现代的 C 中也有效。 2008 我真的很傻。首先,5年前我有一台32位的机器?然后我在一个关于位数的问题中忘记了参数大小?好在下一个答案有一些细节。【参考方案5】:

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

【讨论】:

在旧的 68k mac 上,崩溃! 我假设对齐在这里不会产生影响的原因是两个成员将正确对齐,而不会在它们之间进行填充。我没想到 sizeof 最后会考虑填充。正如我在对答案的编辑中指出的那样,我的假设已被实验证明。【参考方案6】:

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

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

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

【讨论】:

对齐可能发挥作用。【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于如何找到结构的大小? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何获取窗口标题按钮的大小和位置(最小化,恢复,关闭)

OpenGL:加载 3d 模型(比如 obj 文件)后如何找到正确的缩放因子? [关闭]

如何在Coredata中存储自定义结构数组[关闭]

这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]

如何对表单进行风格化以使其真正变大[关闭]

Web框架结构[关闭]