gpt4 book ai didi

c++ - 覆盖 DirectX 结构的新建和删除

转载 作者:太空宇宙 更新时间:2023-11-04 08:39:02 24 4
gpt4 key购买 nike

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

现在一切正常,但我希望使代码更清晰。问题是:有没有办法为这些结构覆盖 new 和 delete(因此 malloc 和指针转换细节被单词“new”隐藏,与 delete 类似),如果是的话如何?

编辑 2014-07-11:

到目前为止的评论提出了两种解决问题的方法:

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

这样做的问题是明显的性能下降和每次都需要访问成员结构(不太干净的代码,这违背了整个目的)。

2) 使用 XMFLOAT4 和类似结构。

问题是这使得内存分配更容易,但增加了类型之间转换的复杂性(因为 XMMATRIX 和 XMVECTOR 是由 DirectXMath 函数返回的)。这些转换还使代码变得不那么简洁,所以就像用猫屎替换一堆狗屎一样,最后它仍然是便便(是的,我能想到的最好的比较来表达意思)。

最佳答案

一般建议使用各种内存结构(XMFLOAT4 等)和加载/存储。如果您只针对 x64 native ,则可以直接使用 XMVECTOR/XMMATRIX,因为该平台默认使用 16 字节对齐的内存。

XMVECTOR 或 XMMATRIX 的重载新建/删除建议。相反,您可以为包含这些类型的您的 类重载 new/delete 以使用 __aligned_malloc( x, 16 )。全局覆盖 new/delete 是可能的,但每个类都这样做实际上是推荐的解决方案。有关重写 new/delete 的详细讨论,请参阅 Scott Meyers 的“Effective C++”书籍。

另一种方法是使用 pImpl idiom喜欢 DirectX Tool Kit做。公共(public)类未对齐,但内部类使用 __aligned_malloc( x, 16 )。这实际上非常有效,实现和客户端代码最终看起来都不像“便便”。

最后,您可以使用 SimpleMath DirectX 工具包中的包装器,它提供从 XMFLOAT4 等派生的具有隐式转换的类。它效率不高,但看起来很干净,无需担心对齐问题。

顺便说一句,MSDN 上的 DirectXMath 程序员指南中涵盖了这个主题。 .

关于c++ - 覆盖 DirectX 结构的新建和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24665278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com