C++,是啥导致引用保存在内存中的方式不同
Posted
技术标签:
【中文标题】C++,是啥导致引用保存在内存中的方式不同【英文标题】:C++, what can cause the difference in the way references are saved in memoryC++,是什么导致引用保存在内存中的方式不同 【发布时间】:2020-05-18 12:27:30 【问题描述】:当我阅读时:Where does the reference variable gets stored
关于引用保存在内存中的方式,我得到了公认的答案:
另一方面,如果引用是“持久的”或对 其他翻译单元(例如数据成员或全局变量), 它必须占用一些空间并存储在某个地方。在这种情况下,它 很可能会被表示为一个指针,使用它的代码将 被编译以取消引用该指针。
有人可以详细说明这一点吗?为什么编译器不能简单地将r
的所有用途视为x[1]
的别名,并直接访问该int。 (下面的函数foo()
就是这种情况)
void foo()
int x[4] = 0, 1, 2, 3;
int &r = x[1];
// more code
【问题讨论】:
引用的内容是struct foo int& fooRef; ;
等用途
它可以而且很可能会。在优化方面,引用比显式使用指针有更多的余地
@Botje 你能解释更多吗?为什么在这个例子中编译器不能仅仅把它当作一个 #define 并且需要为别名 lication 分配内存?
如果您收到 foo
作为函数调用的参数,那将如何工作?或者从std::vector
中挖一个?
"为什么在这个例子中编译器不能把它当作一个#define 并且需要为别名 lication 分配内存?"因为在这种情况下,该引用将引用的变量直到运行时才知道。
【参考方案1】:
为什么编译器不能简单地将 r 的所有用途视为 x[1] 的别名
因为在某些情况下x
不在作用域内,编译器不知道x
。在这种情况下,“x[1]
的别名”没有意义。
引用中提到了此类情况的示例:
(如数据成员或全局变量)
【讨论】:
但全局变量始终在作用域内 加上为什么 x 是否在范围内也很重要,编译器足够聪明并且可以告诉这个 r 在某个位置引用那个 x... @john1998 全局变量在范围内。但是全局变量引用的对象不一定在范围内。它甚至可能不是一个变量。 @john1998 程序必须确切地知道那个位置是什么。 “它在 some 位置”对编译器没有用处。 @john1998 在标题中考虑这个声明:extern int& ri;
(全局引用)。如果此引用在单个翻译单元中定义并在另一个翻译单元中使用,则编译器无法知道何时编译后者是引用绑定。以上是关于C++,是啥导致引用保存在内存中的方式不同的主要内容,如果未能解决你的问题,请参考以下文章
C++ Map中的数据存储方式是啥?Map和HashMap有啥区别?