【问题标题】:How are references encoded in C++? [duplicate]C++ 中的引用是如何编码的? [复制]
【发布时间】:2015-10-09 20:21:39
【问题描述】:
int x = 10;
int& y = x;

为此,x 在堆栈上分配为 2/4/8 字节,00...1010 被写入这些字节。 y 的内存布局及其内容是什么样的?

【问题讨论】:

  • 永远不要假设它是四个字节。可能是八个。 理论上,引用只是为程序员提供便利。在这种情况下,xy 是相同的东西,只是名称不同。在实践中,谁知道呢。如果编译器认为这有帮助,可能会有多个 10 副本。请记住,变量从不占用内存空间,只有它们所代表的值才会占用。
  • AFAIK C++ 标准只规定引用应该是另一个对象的别名,并不要求它以任何特定的方式实现,所以你不应该依赖这个。
  • @Borgleader 确实如此,尽管它们的行为确实很像常量自动取消引用指针
  • @KABoissonneault Shhhhhhhhhhhhhhhhhhhhhhhhhh:P
  • 可能是y实际上根本不会被分配,或者被分配为指针

标签: c++ types reference


【解决方案1】:

来自 C++11 标准 8.3.2.4 [dcl.ref]

未指定引用是否需要存储

所以它可能需要也可能不需要任何存储空间。

【讨论】:

    【解决方案2】:

    让我引用http://en.cppreference.com/w/cpp/language/reference

    引用不是对象;它们不一定占用存储空间, 尽管编译器可能会在必要时分配存储空间 实现所需的语义(例如 引用类型通常会增加类的大小 存储内存地址所必需的)

    【讨论】:

    • 该死的,你打败了我 :)
    【解决方案3】:

    从C++语言的角度来看,是没有定义的。

    实际上,编译器通常以与指针完全相同的方式处理引用,即使它们在 C++ 中具有许多不同的属性。这意味着引用变量的地址是物理存储的。也许编译器可以做出的唯一假设是引用不为空。尽管如此,我认为如果不先获取指针,您将无法访问存储在 C++ 代码中引用变量中的地址。

    请注意,编译器通常可以优化引用变量,因此您甚至无法说出它在程序集中的位置。它可以对指针变量做同样的事情。

    【讨论】:

    • 不要忘记引用可以延长寿命;在这些情况下,存储将用于整个对象: { Object& my_object = Object(); // my_object 存在于整个块中 }
    • 您确定引用可以延长单个表达式的寿命吗?在我看来,这将是一个悬而未决的参考。
    • @Lucretiel don't do that
    • @Lucretiel const 引用有时可以延长临时的寿命。但是,认为引用本身占用了这个内存块是很奇怪的:它仍然是尚未删除的对象的内存。
    • 抱歉,我的意思是 一些 引用——右值和常量左值引用。执行我在示例中所做的操作与通过 const ref 或 rvalue ref 将临时值作为函数参数传递完全相同相同。 { 常量对象& val = Object(); ... } 与 void func(const Object&); 完全相同...函数(对象()); @NathanOliver 是的,我明白为什么它很奇怪,但它与右值引用没有什么不同——非常量对象的生命周期延长到引用的生命周期。
    猜你喜欢
    • 2018-07-07
    • 2015-11-27
    • 2016-04-08
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2011-10-05
    相关资源
    最近更新 更多