J'ai joué un peu avec Godbolt de CompilerExplorer. Je voulais voir comment certaines optimisations sont. Mon minimales de travail exemple:
#include <vector>
int foo() {
std::vector<int> v {1, 2, 3, 4, 5};
return v[4];
}
L'assembleur généré (par 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
Comme on peut le voir, clang connaît la réponse, mais fait beaucoup de choses avant de retourner. Il semble à mon que même le vecteur est créé, à cause de "l'opérateur new/delete".
Quelqu'un peut-il m'expliquer ce qui se passe ici et pourquoi il n'est pas juste de retour?
Le code généré par GCC (pas de copié ici) semble de construire le vecteur explicitement. Personne ne sait GCC n'est pas capable d'en déduire le résultat?