Передача переменных в функции - PullRequest
1 голос
/ 04 июня 2010

Быстрый вопрос:

Когда я передаю переменную в функцию, программа создает копию этой переменной для использования в функции?

Если это так, и я знал, что функция будет только читать переменную и никогда не записывать в нее, возможно ли передать переменную в функцию, не создавая копию этой переменной, или я должен просто оставить это до компилятора оптимизации, чтобы сделать это автоматически для меня?

Ответы [ 5 ]

6 голосов
/ 04 июня 2010

Да, параметры, переданные по значению, копируются. Однако вы также можете передавать переменные по ссылке. Ссылка является псевдонимом, поэтому параметр делает псевдоним переменной, а не копию. Например:

void foo(int x) {}
void bar(int& x) {}

int i;

foo(i); // copies i, foo works with a copy
bar(i); // aliases i, bar works directly on i

Если вы пометите его как const, у вас будет псевдоним только для чтения:

void baz(const int&);

baz(i); // aliases i, baz reads-only i

В общем, всегда передавайте по const-ссылке. Когда вам нужно изменить псевдоним, удалите const. И наконец, когда вам нужна копия, просто передайте по значению. *

* И, как хорошее практическое правило, фундаментальные типы (int, char * и т. Д.) И типы с sizeof(T) < sizeof(void*) должны передаваться по значению вместо const-reference, поскольку их размер достаточно мал, копирование будет быстрее, чем совмещение имен.

2 голосов
/ 04 июня 2010

Да, это так.
Если вы знаете, что можете передать аргумент как const, например:

int function(const string& str) {}

Для небольших типов, таких как int, float или char, это не стоит хлопот, поскольку передача ссылки аналогична передаче int. делать это имеет смысл, только если вы передаете большие вещи, такие как vector s или string s.

Компилятор, скорее всего, не собирается выполнять эту оптимизацию за вас, потому что в большинстве случаев он не может знать, что ему разрешено.

1 голос
/ 04 июня 2010

Если функция получает переменные путем копирования, да, программа делает копию:

  void function(int pass_by_value);

Если функция получает переменные по ссылке, нет, программа не делает копию, а использует исходную переменную:
void function2(int & pass_by_reference);

Если функция не изменяет переменную, функция должна получить постоянную ссылку:
void function3(const int & pass_by_constant_reference);

Как правило, классы и структуры должны передаваться по постоянной ссылке. POD (простые старые данные) типы могут быть переданы по значению.

В C ++ вам нужно сообщить компилятору и пользователям ваших функций, как вы хотите передать переменные и будут ли они изменены или нет.

0 голосов
/ 04 июня 2010

В случае с константной ссылкой (const &) в порядке, внутри функции вы можете использовать значение фактической переменной, копии не создаются, однако вы не можете изменить значение исходной переменной, для этого просто используйте & или ( *) в определении функции следующие вызовы функции:

myFunction (x) или myFunction (& x)

надеюсь, это поможет:)

Башак Билги

0 голосов
/ 04 июня 2010

Если вы используете ссылки, передается только псевдоним. Если вы этого не сделаете, копия будет сделана. Это зависит от того, что вам нужно делать с переменными. Если вам нужно использовать параметры, но не изменять их, наилучшим решением (с точки зрения эффективности и семантики) является ссылка на const, за исключением, возможно, действительно небольших типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...