2014-01-24 6 views
0

Если вы передаете большой объект функции, скажем, класс, содержащий большой массив, всегда лучше передавать по ссылке? Идея заключается в том, чтобы построить функцию так:C++, проходящий по ссылке

template<class T> double foo(T& t){...} 

ДОПОЛНЕНИЕ ПОСЛЕ ПЕРВОГО POST: Если бы я хотел функцию, чтобы быть не модифицирование, я хотел бы использовать константную ссылку.

я мог бы вызвать функцию, просто передавая объекты к нему:

T large_data = T(1000000); 
f(large_data); 
+2

В общем, да, если вам не нужна его копия. Кроме того, если вы не измените ввод, используйте ссылку 'const'. – juanchopanza

+1

[Как передать объекты в функции на C++?] (Http://stackoverflow.com/q/2139224/96780) –

ответ

1

Как правило, в C++ для каждого пользовательского типа лучше пройти по ссылке или указателю. В противном случае, кроме производительности, могут возникнуть проблемы, если для вашего объекта требуется специальный конструктор копирования (и, возможно, его реализация не реализована, но сгенерированный компилятор сделает только мелкую копию). Кроме того, нарезка может произойти и т. Д.

2

Это основная идея передачи объекта в функцию по ссылке (с const для неизменяемых объектов): вы не хотите передавать базовое (большое количество) данных, и вы не хотите беспорядочности (проблемы управления памятью, -> и разыменования) указателя.

+0

Пока я согласен с вами, что ссылки лучше выразить ваши намерения Я не понимаю ваши жалобы на '- > 'и' * '. Накладных расходов больше нет, поскольку ссылки обычно используются как указатели. – Paranaix

+0

@Paranaix да, но все это делается под капотом - нет необходимости в 't-> foo()' или '(* t) .foo()' just t.foo(). –

+0

И? Я не вижу накладных расходов? '->' и '*' являются одними из наиболее часто используемых операторов в C++, и ничего особенного и не пишет ли я. 'или' -> 'вообще не имеет значения. Довольно противоречивым является тот факт, что IMO '->' гораздо более четко указывает, что к объекту «ссылочный» обращаются. – Paranaix

Смежные вопросы