由於兩個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說的;它只是一個可變訪問。
當然,手動操作時,你必須確保循環的內部不會改變's'的長度。 –
@GregHewgill:好吧,限制較少我會說你有責任確保循環體代碼是正確的。無論這可能意味着什麼。通常它會涉及確保解引用和訪問是正確的。 –