2014-11-16 48 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

試圖在沒有對齊要求的情況下使用數學庫將導致某些操作失敗,並且您的方法以未定義的方式進行操作。更好地與排列對齊,或找到不同的圖書館。