我的班级有两名成员。
class C {
typeA a;
typeB b;
};
假设没有继承。这堂课我担心三件事。
a
和 b
的构造函数的顺序a
和 b
的析构函数的顺序a
和b
在内存中的布局我可能关心(1)和(2)的一个原因是线程同步。我可能关心的一些原因 (3) 是:
填充
具有两个以上班级成员的空间局部性
第一个类成员的内存偏移量为0
我希望能够同时控制(1)-(3)。然而,似乎当我选择内存中的顺序时,我也选择了构造函数和析构函数的顺序。有没有办法同时控制(1)-(3)?
是的。像这样拼写每个成员:
union {typeA a;};
这可以防止它们自动构造和销毁,从而允许您手动执行此操作(
::new((void *)&a) typeA();
用于构造,a.~typeA();
用于销毁)。
强制提醒,如果启用了异常并且其中一个构造函数抛出异常,则只需销毁已构造的成员。