これはコンパイラに依存しますが、いくつかの既知のコンパイラはのコードでこの明示的な最適化の恩恵を受けます。 -O3と
int getValue() {
return rand();
}
void testA() {
ptr1->ptr2->b = getValue();
ptr1->ptr2->b = getValue();
ptr1->ptr2->b = getValue();
}
void testB() {
struct pqr *ptr2 = ptr1->ptr2;
ptr2->b = getValue();
ptr2->b = getValue();
ptr2->b = getValue();
}
両方
GCC 6.3
とClang 3.9.1はこれにアセンブリ似て生成されます:このコード例については
testA():
mov rax, QWORD PTR ptr1[rip]
mov rbx, QWORD PTR [rax+8] // load
call rand
mov DWORD PTR [rbx], eax // store
mov rax, QWORD PTR ptr1[rip]
mov rbx, QWORD PTR [rax+8] // load
call rand
mov DWORD PTR [rbx], eax // store
mov rax, QWORD PTR ptr1[rip]
mov rbx, QWORD PTR [rax+8] // load
call rand
mov DWORD PTR [rbx], eax // store
testB():
mov rax, QWORD PTR ptr1[rip]
mov rbx, QWORD PTR [rax+8] // load
call rand
mov DWORD PTR [rbx], eax // store
call rand
mov DWORD PTR [rbx], eax // store
call rand
mov DWORD PTR [rbx], eax // store
出典
2017-01-18 10:06:29
Lou
両方のバージョンで生成されたアセンブリを見てみませんか?違いは見えますか? –
'pqr * ptr2'のメモリをどこに割り当てるのですか? – Lundin
これは、これが回答とどのくらい関係がありますか? – Gerhardh