首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GCC中支持C++11内存订购

在GCC中支持C++11内存订购
EN

Stack Overflow用户
提问于 2019-09-04 13:48:13
回答 1查看 60关注 0票数 0

GCC似乎不支持不同的内存排序设置,因为它为松弛、获取和顺序一致生成相同的代码。

我在GCC 7.4和9.1上尝试了以下代码:

代码语言:javascript
复制
#include <thread>
#include <atomic>

using namespace std;

atomic<int> z(0);


void Thr1()
{
  z.store(1,memory_order_relaxed);
}

void Thr2()
{
  z.store(2,memory_order_release);
}

void Thr3()
{
  z.store(3);
}

//------------------------------------------
int main (int argc, char **argv)
{
    thread t1(Thr1);
    thread t2(Thr2);
    thread t3(Thr3);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

当我为上面的函数生成程序集时,我为三个函数中的每个函数都得到了以下内容:

代码语言:javascript
复制
_Z4Thr1v:
.LFB2992:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $1, -12(%rbp)
    movl    $0, -8(%rbp)
    movl    -8(%rbp), %eax
    movl    $65535, %esi
    movl    %eax, %edi
    call    _ZStanSt12memory_orderSt23__memory_order_modifier
    movl    %eax, -4(%rbp)
    movl    -12(%rbp), %edx
    leaq    z(%rip), %rax
    movl    %edx, (%rax)
    mfence
    nop
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE2992:
    .size   _Z4Thr1v, .-_Z4Thr1v
    .globl  _Z4Thr2v
    .type   _Z4Thr2v, @function
_Z4Thr2v:
.LFB2993:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $2, -12(%rbp)
    movl    $3, -8(%rbp)
    movl    -8(%rbp), %eax
    movl    $65535, %esi
    movl    %eax, %edi
    call    _ZStanSt12memory_orderSt23__memory_order_modifier
    movl    %eax, -4(%rbp)
    movl    -12(%rbp), %edx
    leaq    z(%rip), %rax
    movl    %edx, (%rax)
    mfence
    nop
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE2993:
    .size   _Z4Thr2v, .-_Z4Thr2v
    .globl  _Z4Thr3v
    .type   _Z4Thr3v, @function
_Z4Thr3v:
.LFB2994:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $3, -12(%rbp)
    movl    $5, -8(%rbp)
    movl    -8(%rbp), %eax
    movl    $65535, %esi
    movl    %eax, %edi
    call    _ZStanSt12memory_orderSt23__memory_order_modifier
    movl    %eax, -4(%rbp)
    movl    -12(%rbp), %edx
    leaq    z(%rip), %rax
    movl    %edx, (%rax)
    mfence
    nop
    leave
    .cfi_def_cfa 7, 8
    ret

其中所有代码都以存储器围栏指令结束。

EN

回答 1

Stack Overflow用户

发布于 2019-09-04 14:01:03

如果您对性能感兴趣,那么查看未优化的机器码不会给您带来任何好处。下面是gcc -O2生成的代码:

代码语言:javascript
复制
Thr1():
  mov DWORD PTR z[rip], 1
  ret
Thr2():
  mov DWORD PTR z[rip], 2
  ret
Thr3():
  mov DWORD PTR z[rip], 3
  mfence
  ret

如您所见,只有顺序一致的内存顺序才需要mfence

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57782195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档