看看ICC 17生成的用于迭代std :: unordered_map <>的代码(使用https://godbolt.org)让我非常困惑.
我把这个例子简化为:
long count(void** x)
{
long i = 0;
while (*x)
{
++i;
x = (void**)*x;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
使用-O3标志对ICC 17进行编译会导致以下反汇编:
count(void**):
xor eax, eax #6.10
mov rcx, QWORD PTR [rdi] #7.11
test rcx, rcx #7.11
je ..B1.6 # Prob 1% #7.11
mov rdx, rax #7.3
..B1.3: # Preds ..B1.4 ..B1.2
inc rdx #7.3
mov rcx, QWORD PTR [rcx] #7.11
lea rsi, QWORD PTR [rdx+rdx] #9.7
lea rax, QWORD PTR [-1+rdx*2] #9.7 …Run Code Online (Sandbox Code Playgroud)