2014-11-16 49 views
1

假设一个类被声明为具有特定对齐。而且我不能修改那个基类。如何使内存对齐类的派生类失去对齐

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

ATTRIBUTE_ALIGNED16(class) btVector3 
{}; 

class Vector3 : public btVector3 
{}; 

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

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

+0

不能删除该声明吗? – Eric

+0

不,它来自外部库。为了方便起见,我使用Vector3,并且不重新发明轮子,但我不需要特定的对齐方式。 – N0vember

+0

当时还不确定,但是如果对齐方式没有保持,类的内部机制可能不起作用 – Eric

回答

2

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

试图在没有对齐要求的情况下使用数学库将导致某些操作失败,并且您的方法以未定义的方式进行操作。更好地与排列对齐,或找到不同的图书馆。