覆盖DirectX结构的new和delete

时间:2014-07-09 23:28:41

标签: c++ c memory-management direct3d

我在网上关注一些常见的DirectX教程,其中包含类和结构。 由于specific memory allocation issue,我需要为XMVECTOR和XMMATRIX分配内存。

现在一切正常,但我希望使代码更清晰。问题是: 有没有办法覆盖那些结构的新的和删除(所以malloc和指针转换细节被单词" new"隐藏,类似于删除),如果是这样的话?

修改2014-07-11:

迄今为止的评论提出了两种解决问题的方法:

1)为结构使用包装类,为包装类使用重载/覆盖delete和new。

这样做的问题是明显的性能损失以及单次访问成员结构的需要(不太清晰的代码,这会破坏整个目的)。

2)使用XMFLOAT4和类似的结构。

问题在于,这使得内存分配更容易,但在类型之间的转换中增加了复杂性(因为XMMATRIX和XMVECTOR是DirectXMath函数返回的)。这些转换也使得代码不那么干净,所以它就像用猫屎替换一堆狗屎一样,它最后仍然是大便(是的,我可以想出的最佳比较来传达意义)

1 个答案:

答案 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程序员指南中介绍了这个主题。