如果我将结构A定义为:
struct A {
char* c;
float f;
int i;
};
和一个数组
A col[5];
然后为什么
sizeof(*(col+0))
16
答案 0 :(得分:5)
在您的平台上,需要16个字节来保存该结构,结构类型为A
。
您应该记住,*(col+0)
与col[0]
相同,因此它只是结构的一个,而不是整个数组。如果您想要数组的大小,可以使用sizeof(col)
。
答案 1 :(得分:5)
可能是因为:
char*
占用8个字节,而int
和float
占用4个字节,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。