为何Coord结构体大小为40字节而非预期的12/24字节?
为啥
sizeof(Coord)返回40字节? 嘿,这个问题挺典型的,我来帮你拆解一下背后的原因~
咱们一步一步算这个结构体的内存占用:
1. 成员的基础存储空间
先看结构体里的各个成员:
float inate[3]:3个float类型,每个float占4字节,加起来是3*4=12字节。float& x、float& y、float& z:这里要注意C++中,类/结构体的非静态引用成员会被编译器实现为指针(毕竟引用本质是别名,但作为成员变量需要存储目标的地址)。在64位系统下,指针的大小是8字节,三个引用加起来就是3*8=24字节。
把这两部分加起来:12+24=36 字节。
2. 内存对齐的填充字节
这时候还没到40,差的就是编译器自动添加的对齐填充字节了。C++编译器会为结构体/类做内存对齐优化,规则是:整个结构体的大小必须是其「最大对齐单元」的整数倍。
- 这里最大的对齐要求来自引用(也就是指针),64位系统下指针的对齐单元是8字节。
- 36字节不是8的整数倍,最近的8的倍数是40,所以编译器会自动补上4字节的空白,把总大小凑到40字节。
补充:你之前猜测的误区
你觉得应该是12或24字节,问题出在这两个点上:
- 12字节是只算了
inate数组,但完全忽略了三个引用成员的存储空间; - 24字节可能是误以为引用作为“别名”不占内存,但非静态引用成员是需要存储地址的,和指针占用一样的空间,再加上数组的12字节,最后还要考虑对齐,最终就是40字节。
内容的提问来源于stack exchange,提问作者Greg S.
相关产品推荐
相关产品推荐

