有人可以帮我理解sizeof()
运营商的行为吗?
#include <iostream>
using namespace std;
class A{
int first;
double last;
public:
A(int a)
{
cout << a << endl;
}
};
int main()
{
A a(3);
cout << sizeof(a) << endl;
return 0;
}
此代码将我的大小打印为16个字节。类的大小是根据其成员计算的。所以我有4个字节(int
)+ 8个字节(double
)= 12。
那我为什么得到16个字节?
当我评论int
和double
成员时,我得到1个字节。
答案 0 :(得分:1)
编译器列出了 speed 的类内部和其他因素,不一定是节省空间,所以它可能会留下一个空的4字节块 - 大小 - 在拟合下一个元素之前的4个元素。这使得在现代体系结构(基于64位= 8字节)上更快地访问下一个元素。
另外,请注意,类对象的sizeof可能包含您不知道的其他数据,例如指向虚函数表的指针等。这是编译器的工作,并且无论何时生成最终代码都是正确的正确而快速地运行。
答案 1 :(得分:1)
只要POD类与C结构兼容,类中字段的布局就是实现定义的。但是,即使在C structs实现中,由于各种原因(如性能)也会添加填充。因此,您的编译器可能会在int
字段之后添加四个字节的填充,以使double
字段以8字节对齐的地址开始。
如果您特别需要这样做,那么有一些方法可以控制类/结构的对齐和填充,这在编译器之间有所不同。例如,GCC具有类似于__attribute__((packed))
的语法,将删除该填充。这很少是必要的 - 主要是当结构需要映射到设备寄存器时 - 并且通常会损害性能,所以尽可能避免使用它。
答案 2 :(得分:0)
编译器将成员打包到类中的默认方式是尝试与字边界对齐,即字的大小的倍数(64位机器上的8个字节)。要停止打包,请使用#pragma pack(1)
或编译器选项/Zp
。这迫使编译器将成员压在一起。
不允许类具有零大小,因为这可能意味着指向两个不同对象的指针是相同的,因此它的最小大小为1个字节。