我对编译器知之甚少,但知道它们足够复杂和智能,可以优化您的代码。假设我有这样的代码:
string foo = "bar";
for(int i = 0; i < foo.length(); i++){
//some code that does not modify the length of foo
}
GNU 编译器是否足够聪明,可以意识到 foo
的长度在此循环过程中不会改变,并用 foo.length()
调用替换正确的值(value)?还是会为每个 i
比较调用 foo.length()
?
最佳答案
由于 Mysticial 和 Kerrek 都正确地建议查看生成的程序集,下面是一个示例:
#include <string>
using namespace std;
int does_clang_love_me(string foo) {
int j = 0;
for (int i = 0; i < foo.length(); i++) {
j++;
}
return j;
}
我将上面的代码保存在test.cpp中,编译如下:
$ clang++ -o test.o -Os -c test.cpp
-Os 开关告诉 clang 尝试优化最小代码大小。 GCC 有一个相应的开关可以使用。为了查看程序集,我用 otool 命中了生成的目标文件,因为我现在正好在使用 mac。其他平台也有类似的工具。
$ otool -tv test.o
test.o:
(__TEXT,__text) section
__Z16does_clang_love_meSs:
0000000000000000 pushq %rbp
0000000000000001 movq %rsp,%rbp
0000000000000004 movq (%rdi),%rax
0000000000000007 movq 0xe8(%rax),%rcx
000000000000000b xorl %eax,%eax
000000000000000d testq %rcx,%rcx
0000000000000010 je 0x0000001e
0000000000000012 cmpq $0x01,%rcx
0000000000000016 movl $0x00000001,%eax
000000000000001b cmoval %ecx,%eax
000000000000001e popq %rbp
000000000000001f ret
就像Mysticial说的;这只是一个变量访问。
关于c++ - GNU 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130975/