Я думаю, что в самом вопросе есть огромное недоразумение.
Нет связи между объектами, выделенными из стека или кучи, с одной стороны, и передачей по значению, ссылке или указателю, с другой.
Стек против распределения кучи
Всегда, когда это возможно, предпочитайте стек, тогда вам управляют временем жизни объекта, с которым гораздо проще иметь дело.
Возможно, нетвозможно в нескольких ситуациях:
- Виртуальное строительство (представьте себе Фабрику)
- Совместное владение (хотя вы всегда должны избегать его)
И я могу пропустить некоторые, но в этом случае вам следует использовать SBRM (Scope Bound Resources Management), чтобы использовать возможности управления временем жизни стека, например, с помощью умных указателей.
Передать:значение, ссылка, указатель
Прежде всего, существует разница семантика :
- значение, константная ссылка: переданный объектне будет изменен методом
- ссылка: переданный объект может быть изменен методом
- указатель / постоянный указатель: то же самое, что и ссылка (для поведения), но может быть нулевым
Обратите внимание, что некоторые языки (функциональный вид, например, Haskell) не предлагают ссылку / указатель по умолчанию.Значения неизменны после создания.Помимо некоторых обходных путей для работы с внешней средой, они не ограничены этим использованием, и это каким-то образом облегчает отладку.
Ваш друг должен узнать, что в передаче по ссылке нет абсолютно ничего плохогоили передача по указателю: например, вещь swap
, она не может быть реализована с передачей по значению.
Наконец, Полиморфизм не допускает семантику передачи по значению.
Теперь давайте поговорим о производительности.
Обычно хорошо принято, что встроенные модули должны передаваться по значению (чтобы избежать косвенного обращения), а определяемые пользователем классы big должны передаваться по ссылке./ указатель (чтобы избежать копирования). большой на самом деле обычно означает, что конструктор копирования не является тривиальным.
Однако существует открытый вопрос относительно маленьких пользовательских классов.Некоторые статьи, опубликованные недавно, предполагают, что в некоторых случаях передача по значению может позволить лучшую оптимизацию от компилятора, например, в этом случае:
Object foo(Object d) { d.bar(); return d; }
int main(int argc, char* argv[])
{
Object o;
o = foo(o);
return 0;
}
Здесь умный компилятор может определить, что o
могут быть изменены на месте без копирования!(Необходимо, чтобы определение функции было видимым, я думаю, я не знаю, выяснит ли это Оптимизация времени соединения)
Поэтому существует только одна возможность проблемы производительности, как всегда: мера .