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有啥区别?

C++的引用的简单总结

JavaScript学习:变量作用域和内存问题

C++:如果没有对这些不同的创建/初始化、复制、分配方式进行优化,输出是啥?

Js 基本数据类型引用数据类型

关于乱码