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には対応するスイッチがあります。アセンブリを見るために、私は現時点でmacを使用しているので、結果オブジェクトファイルをotoolでヒットします。他のプラットフォームにも同様のツールがあります。
$ 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
それはミスティカルと同様です。それは単なる可変的なアクセスです。
もちろん、これを手動で行うときは、ループの内部が 's'の長さを変更しないようにする責任があります。 –
@GregHewgill:ループ本体のコードが正しいことを確認する責任があるとは限らないと思います。それが意味するものは何でも。通常、間接参照とアクセスが正しいことを保証する必要があります。 –