3

可能重复:
C++ 中引用变量的大小

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

4

1 回答 1

12

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

例如,他们不需要:

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

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

只要您不获取指针的地址,就可以对指针说所有相同的事情。但在指针的情况下,它是编译器主动进行的优化。在引用的情况下,它们在标准中明确定义为别名,并且在编译器不能将引用纯粹视为条目的情况下,指针(或无论如何地址)恰好是实现这一点的明显手段在其编译时名称查找表中。唯一的本质区别是标准描述的抽象机器中发生的事情——在实现和优化之后,它很可能等同于同一件事。

于 2012-12-20T11:28:52.813 回答