Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему в C++ передача аргумента функции по значению считается более быстрой, чем по ссылке?

Ып Мастер (1739), закрыт 7 лет назад
Удивился, когда прочел это в учебнике, т. к. всегда думал обратное.
Лучший ответ
East RX Просветленный (24468) 7 лет назад
Это зависит от конкретной ситуации (тем более при таких навороченных оптимизациях, как в компиляторах C++), но бывает, причём достаточно часто. Например, если значение переменной в данный момент находится в регистре, то при передаче по ссылке нужно:
1) сначала поместить это значение в память, выделенную для переменной;
2) вычислить точный адрес этой памяти, который на этот момент неизвестен, т. к. для адресации переменных используются относительные адреса (относительно ebp);
3) поместить этот адрес в стек.
Итого - 3 операции, примерно так:

mov [ebp - 10], eax
lea eax, [ebp - 10]
push eax

А для передачи значения из регистра достаточно одной операции - сразу отправить его в стек:

push eax
Остальные ответы
johnsilver Просветленный (22598) 7 лет назад
тут надо знать ассемблер. я точно не скажу, но вижу так.
при передачи значения они загружаются в стек и потом выбираются из него. к примеру положить и взять значение будет 2 такта процессорного времени. если передавать по ссылке, то скажем положить ссылку и взять ее будет те же 2 такат, + такт на загрузку значения по ссылке.
с количеством тактов вру, но вижу как то так. хочешь проверить - напиши 2 проги и проверь машинные коды.
Лёха Мастер (1684) 7 лет назад
Ссылка вообще не объект. Поэтому ничего не копируется.
Объект - это объект, поэтому при передаче по значению, вовнутрь функции копируется каждый его бит.

Потому и быстрее.
По ссылке.

Ещё раз учебник прочти, ты перепутал.
Или учебник дрянь.
Похожие вопросы