AccessViolation仅在优化的Win32构建(XMMATRIX)
AccessViolation only in Optimised Win32 Build (XMMATRIX)
我在一个函数中设置两个类型为XMMATRIX**的变量时遇到了一些麻烦。函数原型如下所示:
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
,那么问题就消失了。
这确实是一个对齐问题。new DirectX::XMMATRIX在32位程序中只有8字节对齐,而XMMATRIX必须是16字节对齐。
您可以使用__aligned_malloc/__aliged_free而不是new或使用XMFLOAT4X4类型。或者不要从堆中分配单个XMMATRIX值,而是使用堆栈分配的XMMATRIX,它将被正确对齐,因为XMMATRIX被标记为__declspec(align(16))。
这在MSDN上的DirectXMath程序员指南中有介绍。这不是一个很长的文档,它包含了很多建议。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 用CMake构建C++协议
- AccessViolation仅在优化的Win32构建(XMMATRIX)