gpt4 book ai didi

c++ - 仅在优化的 Win32 构建 (XMMATRIX) 中出现 AccessViolation

转载 作者:行者123 更新时间:2023-11-28 06:49:21 24 4
gpt4 key购买 nike

我在函数中设置两个 XMMATRIX** 类型的变量时遇到了一些问题。函数原型(prototype)如下所示:

bool ViewportFactory::CreateViewport(CanvasHandle* canvasHandlePtr, ViewportHandle** outViewportHandlePtr, DirectX::XMMATRIX** outProjectionMatrix, DirectX::XMMATRIX** outViewMatrix)

然后,稍后在函数定义中,我有以下两行:

*outProjectionMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
*outViewMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);

但是,在启用了优化的 Win32 构建中,这些行给我带来了访问冲突。

打开优化后很难准确推断问题出在哪里,但如果我更改这些行以将值设置为 nullptr,那么问题就会消失。

最佳答案

这确实是一个对齐问题。 32位程序中的new DirectX::XMMATRIX只能8字节对齐,XMMATRIX必须16字节对齐。

您可以使用 __aligned_malloc/__aliged_free 代替 new 或使用 XMFLOAT4X4 类型。或者不是从堆中分配单个 XMMATRIX 值,而是使用堆栈分配的 XMMATRIX,因为 XMMATRIX 被标记为 __declspec(align(16)),所以它将正确对齐。

这在 MSDN 上的 DirectXMath 程序员指南中有所介绍。 .这不是一篇很长的文档,但其中包含很多建议。

关于c++ - 仅在优化的 Win32 构建 (XMMATRIX) 中出现 AccessViolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311274/

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