首页 > 解决方案 > 什么情况下 MSVC c++ 编译器选项 /volatile:ms 和 /volatile:iso 在输出汇编程序中显示差异?

问题描述

以下 msvc 命令行选项建议使用该选项/volatile:ms(默认)引入内存围栏,但在使用/volatile:iso. 我无法提出任何执行此操作的示例代码。

例如我的随机尝试之一

https://godbolt.org/z/qrz18j3h9

volatile int A, B;


void foo()
{
    A = B+1;
    B = A+1;
}

生成以下 asm

int volatile A DD        01H DUP (?)                   ; A
int volatile B DD        01H DUP (?)                   ; B
voltbl  SEGMENT
_volmd  DB  00H
        DB      08H
        DB      0eH
        DB      016H
voltbl  ENDS

void foo(void) PROC                                        ; foo, COMDAT
        mov     eax, DWORD PTR int volatile B                    ; B
        inc     eax
        mov     DWORD PTR int volatile A, eax                    ; A
        mov     eax, DWORD PTR int volatile A                    ; A
        inc     eax
        mov     DWORD PTR int volatile B, eax                    ; B
        ret     0
void foo(void) ENDP  

无论我是使用选项/volatile:ms还是/volatile:iso使用 Visual Studio 2019。

有人可以提供一个示例,说明上述两个选项对输出汇编代码有影响吗?

标签: c++multithreadingvisual-c++volatilememory-barriers

解决方案


推荐阅读