小编Ign*_*tov的帖子

为什么编译器会复制一些指令?

有时编译器生成具有奇怪的指令重复的代码,可以安全地删除.考虑以下代码:

int gcd(unsigned x, unsigned y) {
  return x == 0 ? y : gcd(y % x, x);
}
Run Code Online (Sandbox Code Playgroud)

这是汇编代码(由clang 5.0生成并启用了优化):

gcd(unsigned int, unsigned int): # @gcd(unsigned int, unsigned int)
  mov eax, esi
  mov edx, edi
  test edx, edx
  je .LBB0_1
.LBB0_2: # =>This Inner Loop Header: Depth=1
  mov ecx, edx
  xor edx, edx
  div ecx
  test edx, edx
  mov eax, ecx
  jne .LBB0_2
  mov eax, ecx
  ret
.LBB0_1:
  ret
Run Code Online (Sandbox Code Playgroud)

在以下代码段中:

  mov eax, ecx
  jne .LBB0_2
  mov eax, …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction clang

58
推荐指数
2
解决办法
1576
查看次数

在C++模块中的模板内使用非导出函数

考虑以下模块:

module M;

// a private, non-exporting function
int id(int x) {
    return x;
}

export
template <class T>
int f(T x) {
    return id(0);
}

export
int g(int y) {
    return id(1);
}
Run Code Online (Sandbox Code Playgroud)

以下使用它的C++代码:

import M;

int main() { 
    g(42);
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

它与VS2015更新1和作品编译成功,但如果我代替gf,编译器会抱怨:error C3861: 'id': identifier not found.

怎么解决?

c++ visual-c++

8
推荐指数
1
解决办法
169
查看次数

标签 统计

c++ ×2

clang ×1

compiler-construction ×1

visual-c++ ×1