来自this question,因此来自标准(ISO C ++ - 03):
未指明引用是否需要存储(3.7)。
在该线程的一些答案中,据说引用在内部具有相同的指针结构,因此具有相同的大小(32/64位)。
我正在努力掌握的是:参考如何不来要求存储?
非常感谢任何举例的示例代码。
修改:
来自@ JohannesSchaub-litb评论,有什么类似的,如果我没有使用const &
,或者如果我使用默认值const &
,它需要分配吗?在某种程度上,在我看来,根本不应该对引用进行分配 - 当然,除非涉及明确的分配,例如:
A& new_reference(*(new A())); // Only A() instance would be allocated,
// not the new_reference itself
有这样的情况吗?
答案 0 :(得分:5)
采取简单的措施:
int foo() {
int x = 5;
int& r = x;
r = 10;
return x;
}
实现可能在幕后使用指向x
的指针来实现该引用,但没有理由这样做。它也可以将代码转换为等效形式:
int foo() {
int x = 10
return x;
}
然后不需要任何指针。编译器可以将其直接烘焙到r
与x
相同的可执行文件中,而无需存储和取消引用指向x
的指针。
关键是,引用是否需要任何存储是一个您不需要关心的实现细节。
答案 1 :(得分:0)
我认为理解的关键是引用类型是不是对象类型。
对象类型是(可能是cv限定的)类型,它不是函数类型,不是引用类型,而不是 void type
(§3.9[basic.types]/8)
对象需要存储(“对象是存储区域。” - §1.8[intro.object] / 1)
此外,C ++程序对对象进行操作:“C ++程序中的构造创建,销毁,引用,访问和操作对象。” - 同一段
因此,当编译器遇到程序中的引用时,编译器是否必须合成对象(通常是指针类型),因此,使用一些存储,或找到一些其他方法来实现对象模型(可能不涉及存储)的所需语义。