struct-array的大小

时间:2011-12-20 00:58:01

标签: c++

如果我将结构A定义为:

struct A {
    char* c;
    float f;
    int i;
};

和一个数组

A col[5];

然后为什么

sizeof(*(col+0)) 

16

6 个答案:

答案 0 :(得分:5)

在您的平台上,需要16个字节来保存该结构,结构类型为A

您应该记住,*(col+0)col[0]相同,因此它只是结构的一个,而不是整个数组。如果您想要数组的大小,可以使用sizeof(col)

答案 1 :(得分:5)

可能是因为:

  • 您使用的是64位平台,char*占用8个字节,而intfloat占用4个字节,
  • 你在32位平台上,char*占用4个字节,但你的编译器决定如果在那里丢弃4个字节的填充,那么数组会更快。填充可以分别通过#pragma pack(push,1)和#pragma pack(pop)在大多数编译器上进行控制。

如果你想确定,你可以使用offsetof(在GCC上)或创建一个对象并检查其成员字段的地址,以检查哪些字段实际填充了多少。

答案 2 :(得分:4)

首先,您的原始声明不正确(现在已在问题编辑中修复)。 A是该类型的名称;声明一个名为col的数组,你想要

A col[5];

col A[5];

sizeof(*(col+0))sizeof col[0]相同,与sizeof (A)相同。

这是16,因为这是你所使用的编译器和系统的结构大小(你还没有提到它是什么)。

我从你期待不同的问题中得到它,但你没有这么说。

编译器可以在成员之间或最后一个成员之后插入填充字节,以确保每个成员都正确对齐。我发现16位字节对于64位系统上的结构来说是一个不足为奇的大小 - 在这种特殊情况下,可能甚至不需要填充。

如果您不知道,sizeof会产生以字节为单位的结果,其中一个字节通常(但不总是)为8位。

答案 3 :(得分:2)

您的问题很可能是您的处理器平台在浮点数上使用8字节对齐。所以,你的char *将取4(假设你在32位系统上),因为它是一个地址指针。你的浮点数将取8,你的int将取另外4个,总计16个字节。

编译器通常会使某些类型在某些字节边界上对齐,以加快正在使用的硬件平台上的计算速度。

例如,如果您这样做:

struct x {
    char y;
    int z;
};

您的系统(可能)会说x的大小为8,将char填充到结构内的int。

您可以添加编译指示(依赖于实现)来停止此操作:

#pragma pack(1)
struct x {
    char y;
    int z;
};
#pragma pack(0)

这将使其大​​小等于5.

答案 4 :(得分:2)

修改:此问题似乎有两个部分。 “为什么sizeof(A)等于16?”总的来说,我现在看到这可能是有意的问题。相反,我正在回答第二部分,即“为什么sizeof(*(col+0)) == sizeof(A)?”

col是一个数组。 col + 0对于数组没有意义,因此编译器必须首先将col转换为指针。然后,col实际上只是A*。向指针添加零不会改变任何内容。最后,您使用*取消引用它,并留下一个16的简单A

简而言之,sizeof(A) == sizeof(*(col+0))

PS:我没有解决这个问题“为什么数组中的一个元素占用16个字节?”其他人已经回答得很好。

答案 5 :(得分:0)

在现代x86-64处理器上,char*为8个字节,float为4个字节,int为4个字节。所以加在一起的成员的大小是16.你还期待什么?有人告诉你指针是4个字节吗?因为这只适用于x86-32。