在 C++ 中作为指针或别名进行内部编译的引用
is reference in c++ internally compiled as pointers or alias?
本教程说,
您可能注意到此处与指针的相似之处 - 这是真的,引用通常由编译器编写者作为指针实现
同样,有人评论说
什么是C++中的引用变量?
如
技术上不是。如果 bar 是一个变量,你可以得到它的地址。引用是另一个变量的别名(不是地址,因为这意味着编译器需要插入取消引用操作)。当这个被编译出来时,bar可能只是被foo取代
哪种说法是正确的?
是正确的,但情况不同。
从语义上讲,引用变量只是为对象引入了一个新名称(在C++意义上的"对象")。
(关于"变量"和"对象"的含义有很多混淆,但我认为许多其他语言中的"变量"在C++中被称为"对象",这就是你的第二个引号所指的"变量"。
如果此引用未存储在任何位置或作为参数传递,则它根本不必须具有任何表示形式(编译器可以只使用它引用的任何内容)。
如果它被存储(例如作为成员)或作为参数传递,编译器需要给它一个表示,最明智的是使用它引用的对象的地址,这与指针的表示方式完全相同。
请注意,该标准明确表示它未指定引用变量是否具有任何大小。
C++标准在§8.3.2/4中指出:
未指定引用是否需要存储。
这种非规范是指针实现和别名实现都是有效实现的主要原因。
因此,两者都可能是对的。
从某种意义上说,它们都是真的。引用是否编译为指针是编译器的实现细节,而不是C++标准的一部分。某些编译器可能使用常规指针,而某些编译器可能使用其他形式或别名引用的变量。
考虑以下行:
int var = 0;
int &myRef = var;
编译器"A"可以将myRef
编译为指针,编译器"B"可以使用其他方法来使用myRef。
当然,同一个编译器也可能根据上下文以不同的方式编译引用。例如,在我上面的例子中,myRef
可能会被完全优化,而在需要存在引用的上下文中(例如方法参数),它可以编译为指针。
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- 遇到内部编译错误时该怎么办
- 从代码内部编译QT源代码
- 在cpp项目(VS2005)内部编译的c模块中无法识别内联关键字
- 交叉编译助推 1.60.0 内部依赖问题
- 在 C++ 中作为指针或别名进行内部编译的引用
- 使用SSE内部函数编译一个简单的c++程序
- C++成员函数内部PTHREAD_MUTEX_INITIALIZER无法编译
- 使用模板类时出现内部编译错误
- 在矢量上使用调整大小时,矢量内部结构中的unique_ptr不会编译
- 当杂注内部有编译指示时,OpenMP 中会发生什么?
- 在C/ c++语言…for循环在内部编译为While循环
- 类内部的纯虚析构函数定义会导致编译错误
- 内部编译错误,而使用增强精神x3
- 模板类内部的Typedef-type给出编译错误
- 在windows 7上编译源Qt 4.7.4错误qmake不是内部或外部命令
- 内部编译错误:分割错误在gcc.发送可变模板到struct时
- 编译 Android 版 Qt:"mingw32-make"不被识别为内部或外部命令
- 如何防止std标头(在Xcode中)内部发生编译错误
- 如何摆脱内部编译错误:非法指令min() _GLIBCXX_USE_NOEXCEPT{返回__FLT_MIN__;}