在 C++ 中作为指针或别名进行内部编译的引用

is reference in c++ internally compiled as pointers or alias?

本文关键字:内部 编译 引用 别名 C++ 指针      更新时间:2023-10-16

本教程说,

您可能注意到此处与指针的相似之处 - 这是真的,引用通常由编译器编写者作为指针实现

同样,有人评论说

什么是C++中的引用变量?

技术上不是。如果 bar 是一个变量,你可以得到它的地址。引用是另一个变量的别名(不是地址,因为这意味着编译器需要插入取消引用操作)。当这个被编译出来时,bar可能只是被foo取代

哪种说法是正确的?

两者都

是正确的,但情况不同。

从语义上讲,引用变量只是为对象引入了一个新名称(在C++意义上的"对象")。
(关于"变量"和"对象"的含义有很多混淆,但我认为许多其他语言中的"变量"在C++中被称为"对象",这就是你的第二个引号所指的"变量"。

如果此引用未存储在任何位置或作为参数传递,则它根本不必须具有任何表示形式(编译器可以只使用它引用的任何内容)。

如果它被存储(例如作为成员)或作为参数传递,编译器需要给它一个表示,最明智的是使用它引用的对象的地址,这与指针的表示方式完全相同。

请注意,该标准明确表示它未指定引用变量是否具有任何大小。

C++标准在§8.3.2/4中指出:

未指定引用是否需要存储。

这种非规范是指针实现和别名实现都是有效实现的主要原因。

因此,两者都可能是对的。

从某种意义上说,它们都是真的。引用是否编译为指针是编译器的实现细节,而不是C++标准的一部分。某些编译器可能使用常规指针,而某些编译器可能使用其他形式或别名引用的变量。

考虑以下行:

int var = 0;
int &myRef = var;

编译器"A"可以将myRef编译为指针,编译器"B"可以使用其他方法来使用myRef。

当然,同一个编译器也可能根据上下文以不同的方式编译引用。例如,在我上面的例子中,myRef可能会被完全优化,而在需要存在引用的上下文中(例如方法参数),它可以编译为指针。