Да, это забавная пропущенная оптимизация.
Похоже, что было решено оптимизировать векторное хранилище / скалярную перезагрузку в векторный экстракт, что обычно хорошо.
Но это было сделано безпринять во внимание соглашение о вызовах, в котором нет сохраняемых вызовов векторных регистров.Этот код был бы хорош в Windows x64, где он мог бы использовать, например, xmm6.
Этот код также был бы в порядке, если бы вы вызывали функции, которые встроены, или если вы передали все 4 элемента в качестве аргументов вта же функция.(например, printf
).
GCC имеет несколько проходов, и не зависящие от архитектуры средние проходы, работающие на GIMPLE-представлении логики программы, иногда не могут воспользоваться полными деталями, которые не известны до регистрациивремя распределения.Некоторые оптимизации трудны для gcc, потому что они просто не могут видеть их.
Кстати, если вы заботитесь об этом уровне эффективности, используйте '\n'
вместо endl
.Вам не нужно явно очищать cout
там.