I played around with Godbolt's CompilerExplorer. I wanted to see how good certain optimizations are. My minimum working example is:
#include <vector>
int foo() {
std::vector<int> v {1, 2, 3, 4, 5};
return v[4];
}
The generated assembler (by 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
As one can see, clang knows the answer, but does quite a lot of stuff before returning. It seems to my that even the vector is created, because of "operator new/delete".
Can anyone explain to me what happens here and why it does not just return?
The code generated by GCC (not copied here) seems to construct the vector explicitly. Does anyone know GCC is not capable to deduce the result?
question from:
https://stackoverflow.com/questions/47072261/why-isnt-this-unused-variable-optimised-away 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…