Не стесняйтесь добровольно и отправить обновленную формулировку в комитет ...

ал с Godbolt's CompilerExplorer. Я хотел посмотреть, насколько хороши определенные оптимизации. Мой минимальный рабочий пример:

#include <vector>

int foo() {
    std::vector<int> v {1, 2, 3, 4, 5};
    return v[4];
}

Сгенерированный ассемблер (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

Как видно, Clang знает ответ, но перед возвращением делает довольно много вещей. Мне кажется, что даже вектор создан, из-за «оператора new / delete».

Может кто-нибудь объяснить мне, что здесь происходит, и почему он не просто возвращается?

Код, сгенерированный GCC (здесь не скопированный), похоже, явно создает вектор. Кто-нибудь знает, что GCC не способен выводить результат?

Ответы на вопрос(3)

Ваш ответ на вопрос