Ste*_*sop 11
有时候他们这样做,有时他们没有.当他们需要时(例如当用作数据成员时),他们会这样做.
例如,他们不需要:
int a = 1;
int &b = a;
Run Code Online (Sandbox Code Playgroud)
现在,编译器可以b纯粹视为别名a.永远不需要为此分配内存b,因为引用不是对象.
另一个可能感兴趣的案例:
int some_function_call(); // function returns by value
const int &c = some_function_call();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,c是对临时对象的引用,它是调用的返回值.临时的生命延伸到了范围c,所以在这个意义上你可以说它c消耗了一个int大小的内存.但是没有特别的原因,编译器需要分配更多.您可能会看到与编写时相同的发出代码const int c = some_function_call();,这也会创建int具有相同生命周期和相同名称的对象c.
至于将它们作为参数传递 - 它取决于调用约定参数是否占用内存.某些参数可能会在寄存器中传递.然后,它取决于被调用者代码,该寄存器是否最终在执行函数期间溢出到某处堆栈.但是,是的,当作为参数传递并且函数调用未内联时,引用参数必须占用"某事",因为调用者必须以某种方式让被调用者知道引用所引用的对象的地址("referand").
如果您没有获取指针的地址,则可以说指针的所有相同内容.但在指针的情况下,它是编译器自己的主动优化.在引用的情况下,它们在标准中明确定义为别名,并且指针(或任何速率地址)恰好是在编译器不能将引用纯粹视为条目的情况下实现它的明显方法在其编译时名称查找表中.唯一的本质区别是标准描述的抽象机器中发生的事情 - 在实现和优化之后它可能完全相同.