将变量传递给函数

时间:2010-06-03 20:40:18

标签: c++ optimization function

一个简单的问题:

当我将变量传递给函数时,程序是否会复制该函数中使用的变量?

如果确实如此,我知道该函数只会读取变量并且永远不会写入该变量,是否可以将变量传递给函数而不创建该变量的副本,或者我应该将其留给编译器优化为我自动执行此操作?

5 个答案:

答案 0 :(得分: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

如果将其标记为const,则只有一个只读别名:

void baz(const int&);

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

通常,总是通过const-reference传递。当您需要修改别名时,请删除const。最后,当您需要副本时,只需按值传递。*

*作为一个好的经验法则,基本类型(int,char *等)和带sizeof(T) < sizeof(void*)的类型应该通过值而不是const-reference传递,因为它们的大小很小足够复制将比混叠更快。

答案 1 :(得分:2)

是的确如此 如果你知道你可以将参数传递给const&amp;像这样:

int function(const string& str) {}

对于像int或float或char这样的小类,这不值得麻烦,因为传递引用与传递int相同。只有当你传递vectorstring s这样的大事时,这样做才有意义。

编译器很可能不会为你做这个优化,因为在大多数情况下它不知道它是允许的。

答案 2 :(得分:1)

如果函数通过复制接收变量,则程序确实复制了该文件:

  void function(int pass_by_value);

如果函数通过引用接收变量,则程序不会复制但使用原始变量:
void function2(int & pass_by_reference);

如果函数没有修改变量,函数应该接收一个常量引用:
void function3(const int & pass_by_constant_reference);

通常,类和结构应该通过常量引用传递。 POD(普通旧数据)类型可以按值传递。

在C ++中,您需要告诉编译器和用户您的函数,您希望如何传递变量以及是否修改它们。

答案 3 :(得分:0)

如果使用引用,则只传递别名。如果不这样做,将会制作副本。这取决于你需要对变量做什么。如果你需要使用这些参数,而不是更改它们,那么const引用是最好的解决方案(效率和语义方面),除非是非常小的类型。

答案 4 :(得分:0)

在const引用(const&amp;)情况下,在函数内部你可以使用实际变量的值,不会生成副本,但是你不能修改原始变量的值,为此目的只需使用&amp;或(*)在函数定义中,函数调用如下:

myFunction(x)或myFunction(&amp; x)

希望它有所帮助:)

BaşakBilgi