Ради аргумента давайте проигнорируем тривиальный случай удаления различий оптимизаторами. Предположим также, что вы используете 64-битные соглашения о вызовах Intel для Microsoft (которые отличаются от Linux ABI), тогда у вас есть 4 64-битных регистра для передачи таких значений, прежде чем вам придется прибегнуть к их проталкиванию в стек. Это явно лучше.
Для 32-битного приложения по значению и они попадут прямо в стек. Вместо этого по ссылке можно поместить указатель в регистр (опять же, несколько таких случаев использования регистра разрешены до обращения к стеку). Мы можем сделать это в некотором выводе g++ -O3 -S, вызвав f1(99) по значению и f2(101) по константной ссылке:
void f1(int64_t);
void f2(const int64_t&);
int main()
{
f1(99);
f2(101);
}
...
pushl 0
pushl $99
call _Z2f1x // by value - pushed two halves to stack
leal -8(%ebp), %eax
movl %eax, (%esp)
movl $101, -8(%ebp)
movl $0, -4(%ebp)
call _Z2f2RKx // by const& - ugly isn't it!?!
Затем вызываемая функция должна будет получить перед первым использованием (если таковое имеется). Вызываемая функция может кэшировать значения, прочитанные в регистрах, поэтому это необходимо только один раз. При подходе со стеком значение может быть перечитано по желанию, поэтому регистр не нужно резервировать для этого значения. При подходе с указателем либо указатель, либо 64-битное значение может потребоваться сохранить в более предсказуемом месте (например, в принудительном или другом менее полезном регистре), если этот регистр необходимо на мгновение освободить для какой-либо другой работы, но 64-битный параметр int понадобится снова позже. В общем, трудно угадать, что быстрее - может зависеть от процессора/использования регистров/оптимизатора/и т. д., и не стоит пытаться.
Узел для совета pst...
"эффективность" :( KISS. Передайте это, как вы передаете любое другое чертово целое число. - pst
... хотя иногда вы применяете KISS к параметрам шаблона и делаете их все константами T&, хотя некоторые из них могут вписываться в регистры....
person
Tony Delroy
schedule
10.11.2010