¿Por qué esta variable no utilizada no está optimizada?
Jugué con el compilador Explorador de Godbolt. Quería ver qué tan buenas son ciertas optimizaciones. Mi ejemplo mínimo de trabajo es:
#include <vector>
int foo() {
std::vector<int> v {1, 2, 3, 4, 5};
return v[4];
}
El ensamblador generado (por clang 5.0.0, -O2 -std = c ++ 14):
foo(): # @foo()
push rax
mov edi, 20
call operator new(unsigned long)
mov rdi, rax
call operator delete(void*)
mov eax, 5
pop rcx
ret
Como se puede ver, el sonido metálico sabe la respuesta, pero hace muchas cosas antes de regresar. Me parece que incluso el vector se crea, debido a "operador nuevo / eliminar".
¿Alguien puede explicarme qué sucede aquí y por qué no solo regresa?
El código generado por GCC (no copiado aquí) parece construir el vector explícitamente. ¿Alguien sabe que GCC no es capaz de deducir el resultado?