Por que essa variável não utilizada não é otimizada?
Eu brinquei com o CompilerExplorer de Godbolt. Eu queria ver como são boas certas otimizações. Meu exemplo de trabalho mínimo é:
#include <vector>
int foo() {
std::vector<int> v {1, 2, 3, 4, 5};
return v[4];
}
O assembler gerado (pelo 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 pode ver, clang sabe a resposta, mas faz muitas coisas antes de retornar. Parece-me que até o vetor é criado, devido ao "operador new / delete".
Alguém pode me explicar o que acontece aqui e por que não volta apenas?
O código gerado pelo GCC (não copiado aqui) parece construir explicitamente o vetor. Alguém sabe que o GCC não é capaz de deduzir o resultado?