如何找到结构的大小?

时间:2020-03-06 14:49:08  来源:igfitidea点击:
struct a
{
    char *c;
    char b;
};

sizeof(a)是多少?

解决方案

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

我怀疑意思是"结构",而不是"严格"和"字符",而不是"字符"。

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

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

这将取决于体系结构以及如何处理基本数据类型。这也将取决于系统是否需要自然对齐。

确切的值是sizeof(a)。
我们可能还会冒险,并假设在这种情况下该风险不小于2且不大于16.

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

#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'占用1个字节,剩下3个填充字节将其带入下一个4的倍数。 :8.如果要更改此打包,大多数编译器都有一种方法可以更改它,例如,在MSVC上:

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

给出sizeof(a)==5. 如果执行此操作,请在任何库头文件之前小心重置包装!

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

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

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

如果要手动计数,则结构的大小就是考虑对齐后的每个数据成员的大小。结构没有魔术开销字节。