经过深思熟虑,我将问题简化为以下简单示例:
//__declspec(align(16)) class Vec4 {}; //For testing purposes on Windows
//class Vec4 {} __attribute__((__aligned__(16))); //For testing purposes on *nix
class Base { public:
Vec4 v; //16-byte-aligned struct
};
class Child : public Base {};
static_assert(alignof( Base)>=16,"Check 1");
static_assert(alignof(Child)>=16,"Check 2");
检查1次通过;检查2失败。 我的问题:为什么?
实际上,分配
Child
(即new Child
)将导致v
可能是8
-byte-aligned(v
使用SSE,因此又会导致崩溃)。编译器是Intel Compiler2016。我尝试了g++和Clang,它们似乎还不错。这可能是编译器错误吗?
最佳答案
我有asked Intel directly。尽管最初可以由他们的团队复制,但几天后就不可能了。我和他们都没有解释。因此,magic确实存在,并且没有造成伤害。
关于问题的实质:是的,看来子代的对齐方式至少应与基数的对齐方式一样大,而没有这样做的编译器是错误的。
N.B.堆栈分配尊重该类的alignof
,但是malloc
/ new
不这样做(他们怎么知道?)。正如另一个答案所说,必须使用自定义堆分配器。此问题与正确的alignof
本身是分开的。
关于c++ - child 的对齐方式比基座的对齐方式小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33862001/