Я играл с Godbolt CompilerExplorer. Я хотел видеть, насколько хороши определенные оптимизации. Мой минимальный рабочий пример:
#include <vector>
int foo() {
std::vector<int> v {1, 2, 3, 4, 5};
return v[4];
}
Сгенерированный ассемблер (по clang 5.0.0, -O2 -std = С++ 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
Как видно, clang знает ответ, но перед возвращением достаточно много материала. Мне кажется, что даже вектор создан из-за "оператора new/delete".
Может кто-нибудь объяснить мне, что здесь происходит и почему он не просто вернулся?
Код, созданный GCC (не скопированный здесь), как представляется, явно создает вектор. Кто-нибудь знает, что GCC не способен вывести результат?