如何使内存对齐类的派生类失去对齐

时间:2014-11-16 02:16:37

标签: c++ visual-c++ memory-alignment

假设一个类被声明为具有特定的对齐方式。而且我无法修改该基类。

#define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a

ATTRIBUTE_ALIGNED16(class) btVector3
{};

class Vector3 : public btVector3
{};

是否有可能使派生类Vector3失去对齐?

在MSVC下,对齐非常有限,因为它阻止了传递值。我的派生类并不特别需要它,在模板编写中,使用可以通过值传递的类很方便。

1 个答案:

答案 0 :(得分:2)

小心 - 如果btVector3来自Bullet物理库(其中bt是其数学函数的前缀),则由于SIMD数学函数,btVector3与16字节边界对齐。此外,btVector3被定义为4个浮点数和128位类型的并集,在大多数环境中需要16字节对齐。见http://bulletphysics.org/Bullet/BulletFull/btVector3_8h_source.html

尝试使用没有对齐要求的数学库会导致某些操作失败,并且您的方法以未定义的方式操作。最好与对齐一起生活,或找到不同的库。