如何找到结构的大小? [关闭]
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 文件)后如何找到正确的缩放因子? [关闭]