gpt4 book ai didi

c++ - 这是数据对齐崩溃吗? (可能涉及堆栈错位、XNAMath、Visual Studio 2103)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:18 25 4
gpt4 key购买 nike

我的 Win32、DirectX 游戏在处理 vector 和矩阵的代码中以 Release模式崩溃。具体来说,崩溃发生在这条指令上:

014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]

First-chance exception at 0x014E2752 in RodinaRelease.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF

我不太了解汇编和寄存器,但看起来 esp = 0x0043f31c 会使 esp+3Ch = 0x0043f358

现在,根据thisthis , unpcklps 指令是一条 SSE 指令,需要 16 字节对齐。 0x0043f358 不是 16 字节对齐的,对吗?我认为堆栈对齐是我崩溃的原因是否正确?

如果是这样,我做了什么值得这样????我在我的游戏中不使用 SSE 指令,所以我可以忽略像这样的对齐问题——这是天真/错误吗?有什么办法可以关闭此行为吗?

相关要点:

  • 我最近升级到 Visual Studio 2013,我怀疑这个错误是在这个时候出现的。我找到了一个 bug report这与我的问题类似。

  • 我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是一个问题。我正在处理的具体崩溃与我自己的 vector 类型有关,但它与 XMMATRIX 代码非常接近,我相信它们都是通过优化混合在一起的。

  • 我的游戏构建为 Win32 应用程序。切换到 x64 是解决这个问题的可行解决方案还是太荒谬了?我不知道除了需要获得我使用的 64 位版本的库之外还会有什么后果。

最佳答案

参见 this answer了解更多详情。

请记住,用于 x86 的 VS 2013 默认使用 /arch:SSE2,因此即使定义了 _XM_NO_INTRINSICS_,编译器仍将使用 SSE/SSE2。出于这个原因,您可能应该停止使用 _XM_NO_INTRINSICS_,让您的代码正确使用 DirectXMath 或 XNAMath。

也就是说,您可以尝试使用 /arch:IA32 进行构建,以强制 Visual Studio 使用旧式 x87 而不是 SSE/SSE2...

关于c++ - 这是数据对齐崩溃吗? (可能涉及堆栈错位、XNAMath、Visual Studio 2103),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30267730/

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