【发布时间】:2014-12-16 13:16:06
【问题描述】:
这些是我的类定义:
class Foo{
int _ent;
public:
void printEnt() const{cout << _ent << ' ';}
};
class Bar{
Foo _foo;
public:
void printEnt() const{_foo.printEnt();}
};
这是我的测试代码:
char* buf = new char[sizeof(Foo) + sizeof(Foo) + sizeof(Bar)];
fill(buf, buf + sizeof(Foo) + sizeof(Foo) + sizeof(Bar), 'J');
cout << ((int*)buf)[0] << ' ' << ((int*)buf)[1] << ' ' << ((int*)buf)[2] << endl;
Foo* first = new (buf) Foo;
Foo* second = new (buf + sizeof(Foo)) Foo();
Bar* third = new (buf + sizeof(Foo) * 2) Bar;
first->printEnt(); second->printEnt(); third->printEnt();
我的输出是:
1246382666 1246382666 1246382666
1246382666 0 1246382666
但如果我将public 默认ctor 添加到Foo:Foo() : _ent(0) {}
我的输出变成:
1246382666 1246382666 1246382666
0 0 0
这是正确的行为吗?添加我自己的默认 ctor 是否应该消除默认初始化的可能性?
如果重要的话,我会在 gcc 4.8.1 上运行此代码。结果应该是可靠的,因为我正在调试和断言:assert(sizeof(Foo) == sizeof(int) && sizeof(Bar) == sizeof(int));
【问题讨论】:
-
如果有人有兴趣,我开始尝试了解值初始化和默认初始化之间的区别,因此响应:stackoverflow.com/a/27443703/2642059
-
(sizeof(int) / sizeof(char))没有多大意义。sizeof(char)始终为一。您还会忽略对齐和填充。 -
为什么不只是
buf + sizeof(Foo)? -
@pmr 这不是真的。保证
new char[](或new unsigned char[])返回的指针对于任何类型的对象都充分对齐。 -
@JonathanMee 我还没有听说过没有这样的编译器。如果该类具有虚函数,我所知道的 所有 编译器都会分配一个额外的指针(或者有时两个,如果有虚拟继承)。而且我知道的所有编译器都强制对齐,所以像
struct { double d; char c; }这样的东西的大小将大于sizeof(double) + sizeof(char)。 (当然,空类的大小仍然至少为 1。)
标签: c++ initialization default default-constructor