下面的程序使用gcc编译并在32位架构上执行时会返回16个字节。我想知道为什么它会返回,因为它既没有使用长双成员,也没有在64位机器上运行,也没有定义虚函数来获取额外的内存字节,并且在计算double时的大小以及int数据成员,结果大约有12个字节。那么为什么这16个字节值?为什么这个C++程序返回16个字节?
class A {
public:
void* data;
};
void* operator new (size_t sz, A& obj) {
printf("Custom operator new called for %d bytes\n", sz);
return obj.data;
}
class foo {
public:
double a;
int x;
foo() { printf("foo constructor called (this=%p)\n", this); }
};
int main() {
A obj;
obj.data = malloc(sizeof(foo));
printf("Allocator data: %p\n", obj.data); // Allocator data: 0x4601a8
foo *f = new (obj) foo; // Custom operator new called for **16 bytes**
// foo constructor called (this=0x4601a8)
printf("foo allocated at %p\n", f); // foo allocated at 0x4601a8
}
结构物体内可能存在无名填充 – michaeltang
取决于您的默认填充 - 1,2或4个字节的填充,您将得到12.使用8或16字节填充,您将得到16. – cup