C ++引用是否占用任何内存?

时间:2012-12-20 11:26:41

标签: c++ reference

  

可能重复:
  size of reference variable in c++

C ++引用是否消耗任何内存?如果没有,它们如何作为参数传递给函数?

1 个答案:

答案 0 :(得分:11)

有时他们这样做,有时他们没有。当他们需要时(例如当用作数据成员时),他们就会这样做。

他们不需要的例子:

int a = 1;
int &b = a;

现在,编译器可以将b纯粹视为a的别名。这里永远不需要为b分配内存,因为引用不是对象。

另一个可能感兴趣的案例:

int some_function_call(); // function returns by value
const int &c = some_function_call();

在这种情况下,c是对临时对象的引用,它是调用的返回值。临时生命延伸到c的范围,因此在这个意义上你可以说c消耗了一个int大小的内存。但是没有特别的原因,编译器需要分配更多。您可能会看到与编写const int c = some_function_call();相同的发出代码,这也会创建一个生命周期相同且名称相同的int对象c

至于将它们作为参数传递 - 它取决于调用约定参数是否占用内存。某些参数可能会在寄存器中传递。然后,它取决于被调用者代码,该寄存器是否最终在执行函数期间溢出到某处堆栈。但是,是的,当作为参数传递并且函数调用未内联时,引用参数必须占用“某事”,因为调用者必须以某种方式让被调用者知道引用所引用的对象的地址(“referand”)。

如果您没有获取指针的地址,则可以说指针的所有相同内容。但在指针的情况下,它是编译器自己的主动优化。在引用的情况下,它们在标准中明确定义为别名,并且指针(或任何速率地址)恰好是在编译器不能将引用纯粹视为条目的情况下实现它的明显方法在其编译时名称查找表中。唯一的本质区别是标准描述的抽象机器中发生的事情 - 在实现和优化之后它可能完全相同。