Разрешено ли компилятору оптимизировать это (согласно стандарту С++ 17):
int fn() {
volatile int x = 0;
return x;
}
к этому?
int fn() {
return 0;
}
Если да, то почему? Если нет, почему бы и нет?
Здесь некоторые думают об этом предмете: текущие компиляторы компилируют fn()
как локальную переменную, помещенную в стек, а затем возвращают ее. Например, на x86-64 gcc создает это:
mov DWORD PTR [rsp-0x4],0x0 // this is x
mov eax,DWORD PTR [rsp-0x4] // eax is the return register
ret
Теперь, насколько я знаю, стандарт не говорит о том, что локальная изменчивая переменная должна быть помещена в стек. Таким образом, эта версия будет одинаково хороша:
mov edx,0x0 // this is x
mov eax,edx // eax is the return
ret
Здесь edx
хранит x
. Но зачем же здесь останавливаться? Поскольку edx
и eax
равны нулю, мы могли бы просто сказать:
xor eax,eax // eax is the return, and x as well
ret
И мы преобразовали fn()
в оптимизированную версию. Является ли это преобразование действительным? Если нет, какой шаг недействителен?