【问题标题】:What happens after C++ references are compiled?C++ 引用编译后会发生什么?
【发布时间】:2021-05-27 12:32:12
【问题描述】:

编译后,引用变成什么,是地址,还是常量指针?

我知道指针和引用的区别,但我想知道底层实现的区别。

int main()
{
    int a = 1;
    int &b = a;
    int *ptr = &a;
    cout << b << " " << *ptr << endl;  // 1 1
    cout << "&b: " << &b << endl;      // 0x61fe0c
    cout << "ptr: " << ptr << endl;    // 0x61fe0c
    return 0;
}

【问题讨论】:

  • 汇编输出对您有什么建议?
  • 请注意,引用不是 C++ 标准中的 object en.cppreference.com/w/cpp/language/object
  • 举个例子,同一个变量值,同一个地址可以通过指针或者引用找到,没什么特别的。
  • @BarryBao 这就是引用点,一旦分配,它们就与它们所引用的对象无法区分。在您的示例中,&amp;b 和 &amp;a 是同一件事。 不可能获取引用本身的地址。
  • 当然。这是一个人的昵称和一个人的名字之间的关系。

标签: c++ reference


【解决方案1】:

迂腐的答案是:无论编译器感觉如何,重要的是它按照语言语义的规定工作。

要获得实际答案,您必须查看生成的程序集,或者大量使用未定义行为。到那时,它就变成了一个特定于编译器的问题,而不是“一般的 C++”问题

在实践中,需要存储的引用本质上变成了指针,而本地引用往往被编译不存在。后者通常是这种情况,因为保证引用永远不会被重新分配意味着如果您可以看到它被分配,那么您就完全知道它指的是什么。但是,您不应该依赖此来确保正确性。

为了完整起见

可以一些了解编译器在有效代码中所做的事情,方法是将包含引用的结构的内容memcpying 到char 缓冲区中:

#include <iostream>
#include <array>
#include <cstring>

struct X {
    int& ref;
};

int main() {
  constexpr std::size_t x_size = sizeof(X);

  int val = 12;
  X val_ref = {val};

  std::array<unsigned char, x_size> raw ;
  std::memcpy(&raw, &val_ref, x_size);

  std::cout << &val << std::endl;

  std::cout << "0x";
  for(const unsigned char c : raw) {
      std::cout << std::hex << (int)c;
  }
  std::cout << std::endl ;
}

当我在我的编译器上运行它时,我得到了 val 的(字节序翻转)地址存储在结构中。

【讨论】:

  • 是的,我只是想了解更多。你说得很对。谢谢你的回答。
  • @BarryBao 我添加了更多细节。
【解决方案2】:

它在很大程度上取决于编译器,也许编译器决定优化代码,因此它将使其成为价值或......,但据我所知,引用将编译器像指针我的意思是如果你看到他们的结果程序集,它们就像指针一样编译。

【讨论】:

  • 是的,就是最后的地址。谢谢您的回答。我不想死。
猜你喜欢
  • 2018-07-20
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2016-06-14
  • 2023-03-22
  • 1970-01-01
  • 2011-05-12
  • 2012-05-23
相关资源
最近更新 更多