При компиляции для x64 следующая функция использует регистр XMM0 для передачи параметров:
void foo (double const scalar)
{
__m256d vector = _mm256_broadcast_sd(&scalar);
}
В сборке vbroadcastsd
Код операции может принимать операнд регистра. Эквивалентная внутренняя функция, по-видимому, принимает только указатель на операнд памяти. Есть ли способ гарантировать, что компиляторы будут оптимизировать такие нагрузки, чтобы избежать сохранения в памяти?
Я не думаю, что кто-то может ГАРАНТИРОВАТЬ это, но, если вы включите хотя бы некоторую оптимизацию, я был бы очень разочарован, если бы какой-либо современный компилятор не удалил ненужные косвенные указатели … Я определенно видел более сложные проблемы, которые имеет компилятор разобрался как упростить.
Я так понимаю, вы не смотрели на сгенерированный код, чтобы определить, что он делает (потому что ваш вопрос был бы сформулирован иначе).
Если вас беспокоит передача параметров в стеке, то ваша функция, вероятно, слишком короткая или слишком важная, чтобы в конечном итоге вызываться как отдельная функция. использование
__forceinline
с визуальным C ++ или
__attribute__((always_inline))
с g ++.