经过深思熟虑,我将问题简化为以下简单示例:

//__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/

10-11 22:55