如何找到一个结构的大小? [关闭](How do I find the size of a st

2019-07-18 04:14发布

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

什么是的sizeof(一)?

Answer 1:

#include <stdio.h>

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

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

我得到“的sizeof(一)== 8”,在32位机器上。 该结构的总尺寸将取决于填料:以我的情况下,默认填料为4,所以“C”需要4个字节,“B”取的一个字节,留下3个填充字节将其带到的4的倍数:8.如果你想改变这种包装,大多数编译器有办法改变它,例如,在MSVC:

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

给人的sizeof(一)== 5.如果你这样做,小心前任何库头的包装重置!



Answer 2:

相反的是一些其他的答案都表示,在大多数系统中,在不存在一个编译指示或编译选项的,该结构的大小将是至少6个字节,并且在大多数32位系统中,8个字节。 对于64位的系统中,尺寸可以很容易地为16个字节。 对齐功能开始发挥作用; 总是。 sizeof运算单结构必须是这样的,这些尺寸的阵列可以被分配并且该阵列的各个成员所讨论的处理器被充分对准。 因此,如果结构的大小为5如其他人推测,然后两个这样的结构的阵列将是10个字节长,并且在所述第二阵列构件的字符指针将在奇数字节,对齐,而(大多数处理器)导致性能的一大瓶颈。



Answer 3:

如果你想手动指望它,一个结构的大小仅仅是占对齐后,它的每一个数据成员的大小。 有一个结构没有神奇的开销字节。



Answer 4:

的确切值是的sizeof(a)中
你也可以承担风险,并认为正是在这种情况下,不小于2,不大于16。



Answer 5:

这将取决于你的体系结构以及如何对待基本数据类型而有所不同。 这也将取决于系统是否需要自然对齐。



Answer 6:

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



Answer 7:

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

规模将是执行相关的。 在大多数32位系统,它可能会5 - 4个字节为指针,一个用于炭。 我不相信对齐会在这里发挥作用。 如果你换“C”和“b”,但规模可能会增长到8个字节。

好吧,我尝试过了(G ++ 4.2.3,使用-g选项),我得到8。



Answer 8:

sizeof运算的结构应该是一个32位的系统上的8个字节,使得该结构的尺寸变的多个2.这使得可以在正确的字节边界单个结构时结构的阵列被声明。 这是通过在端部3个字节的填充结构来实现的。

如果结构有炭后宣布指针,它仍然是在大小为8个字节,但将已添加的3字节的填充,以保持在一个4字节地址边界对齐的指针(它是一个4字节元素)。

经验法则是,元件应在一偏移量这是它们的字节大小的倍数和结构本身应是一个尺寸,该尺寸的2的倍数的。



文章来源: How do I find the size of a struct? [closed]
标签: c struct sizeof