小编Sav*_*ife的帖子

C / ++。为什么将volatile上的简单整数加法转换为gcc和clang上不同的asm指令?

我写了一个简单的循环:

int volatile value = 0;

void loop(int limit) {
  for (int i = 0; i < limit; ++i) { 
      ++value;
  }
}
Run Code Online (Sandbox Code Playgroud)

我用gcc和clang(-O3 -fno-unroll-loops)进行了编译,得到了不同的输出。它们++value部分不同:

铛:

  add dword ptr [rip + value], 1 # ++value
  add edi, -1                    # --limit
  jne .LBB0_1                    # if limit > 0 then continue looping
Run Code Online (Sandbox Code Playgroud)

gcc:

  mov eax, DWORD PTR value[rip] # copy value to a register
  add edx, 1                    # ++i
  add eax, 1                    # increment a copy of value …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc volatile clang

2
推荐指数
1
解决办法
160
查看次数

标签 统计

assembly ×1

c++ ×1

clang ×1

gcc ×1

volatile ×1