Во-первых, многое зависит от того, передаете ли вы объекты по ссылке или по значению.
В C# и Java вы всегда передаете объекты по ссылке, но на C++ вы можете передать копию объекта объекта в стеке (то есть пропущенного значения). Это включает в себя создание физической копии объекта в памяти, что подразумевает пару вызовов конструктора/деструктора (по крайней мере).
Передача int
может осуществляться либо по значению, либо по ссылке. Если вы переходите по значению, вы копируете тип int
(скажем, 32 bits
) в стек.Если вы передаете указатель, вы копируете адрес (опять же, скажем, 32 bits
) в стек. На самом деле нет никакой разницы в использовании стека. В случае передачи по ссылке вызывающая функция должна будет разыменовать указатель, чтобы получить доступ к значению параметра int
, так что будет некоторый дополнительный код (и, возможно, снижение производительности).
Передача объекта (или структуры) по значению по сравнению с ссылкой более интересна, поскольку они могут имеют очень разные следы памяти (в зависимости от размера класса/структуры).
В общем, передайте по ссылке, чтобы избежать копирования, если размер объекта меньше размера 'void *' или если объект является фундаментальным типом. И если вам когда-нибудь понадобится сделать копию, просто сделайте копию. Для сохранения одной копии не используйте код искажения. C++ 0x вводит семантику перемещения, поэтому ваша копия-версия будет выполняться очень быстро при перемещении в компилятор C++ 0x, если ее можно перенести. Другими словами, просто напишите понятный код, и если производительность когда-либо становится проблемой (через профилирование), вы можете перемещать вещи и редизайн, чтобы избежать копирования. – GManNickG