我在网上关注一些常见的DirectX教程,其中包含类和结构。 由于specific memory allocation issue,我需要为XMVECTOR和XMMATRIX分配内存。
现在一切正常,但我希望使代码更清晰。问题是: 有没有办法覆盖那些结构的新的和删除(所以malloc和指针转换细节被单词" new"隐藏,类似于删除),如果是这样的话?
修改2014-07-11:
迄今为止的评论提出了两种解决问题的方法:
1)为结构使用包装类,为包装类使用重载/覆盖delete和new。
这样做的问题是明显的性能损失以及单次访问成员结构的需要(不太清晰的代码,这会破坏整个目的)。
2)使用XMFLOAT4和类似的结构。
问题在于,这使得内存分配更容易,但在类型之间的转换中增加了复杂性(因为XMMATRIX和XMVECTOR是DirectXMath函数返回的)。这些转换也使得代码不那么干净,所以它就像用猫屎替换一堆狗屎一样,它最后仍然是大便(是的,我可以想出的最佳比较来传达意义)
答案 0 :(得分:2)
一般建议使用各种内存结构(XMFLOAT4等)和Load / Stores。如果您只定位x64 native,则可以直接使用XMVECTOR / XMMATRIX,因为该平台默认使用16字节对齐的内存。
对于XMVECTOR或XMMATRIX,重载新建/删除建议不。相反,您可以为包含这些类型的您的类重载new / delete以使用__aligned_malloc(x,16)。新的/删除的全局覆盖是可能的,但实际上是每个类做它是推荐的解决方案。有关覆盖新/删除的详细讨论,请参阅Scott Meyers“Effective C ++”一书。
另一种方法是像pImpl idiom那样使用DirectX Tool Kit。公共类是未对齐的,但内部类使用__aligned_malloc(x,16)。这实际上工作得很好,实现和客户端代码看起来都不像“大便”。
最后,您可以使用DirectX工具包中的SimpleMath包装器,它提供了从XMFLOAT4等派生的类,并带有隐式转换。它效率不高,但它确实看起来干净而不用担心对齐问题。
顺便说一下,MSDN上的DirectXMath程序员指南中介绍了这个主题。