Я немного поиграл с Compiler Explorer (Godbolt) и заметил кое-что, что я не могу объяснить.
Предположим, у нас есть функция
int answer(){
return 42;
}
Сборка выглядит следующим образом (Clang 9, но другие компиляторы ведут себя аналогично):
push rbp
mov rbp, rsp
mov eax, 42
pop rbp
ret
Что довольноразумный. Теперь, если мы добавим в функцию параметр UNUSED, например:
int answer( double d ){ // or even without name
return 42;
}
, сборка изменится на:
push rbp
mov rbp, rsp
movsd qword ptr [rbp - 8], xmm0
mov eax, 42
pop rbp
ret
Мой вопрос: почему компилятор не пропускает перемещение двойногопотому что он явно не используется (и компилятор знает об этом, потому что предоставляет предупреждения для этого). В чем причина этого?