有时编译器生成具有奇怪的指令重复的代码,可以安全地删除.考虑以下代码:
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) 考虑以下模块:
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和作品编译成功,但如果我代替g用f,编译器会抱怨:error C3861: 'id': identifier not found.
怎么解决?