You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSVC编译含_Atomic float的代码触发Debug断言(Invalid memory order)的问题咨询

MSVC编译含_Atomic float的代码触发Debug断言(Invalid memory order)的问题咨询

大家好,我最近在用MSVC(版本19.37.32822.0)编写包含原子浮点变量的代码时遇到了问题,运行程序直接触发Debug断言,提示“Invalid memory order”,错误定位在vcruntime_c11_atomic_support.h的第417行。

我的代码如下:

static _Atomic float testf;

void func() {
    testf = 1.0f;
    float f = testf;
    printf("%f\n", f);
}

我对x64调用约定不算太熟悉,但查看生成的汇编代码后,发现编译器生成的指令似乎没有正确调用_Atomic_store32和_Atomic_load32这两个内部函数。先给大家看一下这两个函数的声明:

inline void _Atomic_store32(volatile int* _Ptr, int _Desired, int _Order);
inline int _Atomic_load32(const volatile int* _Ptr, int _Order);

对应的汇编代码是这样的:

; 41   :     testf=1.0f;

mov r8d, 5    ; !!This seems to be _Order, corresponding to _Atomic_memory_order_seq_cst
movss   xmm1, DWORD PTR __real@3f800000
lea rcx, OFFSET FLAT:testf
call    _Atomic_store32   ; !!Where is EDX? That should contain _Desired.

; 42   :     float f=testf;

movss   xmm1, DWORD PTR __real@40a00000
lea rcx, OFFSET FLAT:testf
call    _Atomic_load32    ; !!EDX should have _Order.
movss   DWORD PTR f$[rsp], xmm0

能明显看到,调用_Atomic_store32时,本该传递_Desired参数的EDX寄存器完全没被设置;调用_Atomic_load32时,也没在EDX里传入_Order参数。

现在我有点困惑,到底是MSVC的C11原子操作支持存在bug,还是我自己的代码写法哪里出错了?希望有懂这块的朋友能帮忙解答一下,谢谢!

备注:内容来源于stack exchange,提问作者TrayMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:33:12