2010-06-03 5 views
1

Быстрый вопрос:Передача переменных в функции

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

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

+3

Что вы используете в тексте на C++, который не описывает это подробно? – 2010-06-03 20:43:19

+0

Какой учебник? – Faken

+2

В этом проблема. :) Вы должны учиться из хорошего учебника, у нас есть большой список здесь: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

ответ

6

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

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 

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

void baz(const int&); 

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

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

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

2

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

int function(const string& str) {} 

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

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

0

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

1

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

void function(int pass_by_value); 

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

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

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

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

0

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

MYFUNCTION (х) или туРипсЫоп (& х)

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

Басак Bilgi