【问题标题】:How pointers and references are held in memory指针和引用如何保存在内存中
【发布时间】:2015-05-21 14:29:20
【问题描述】:

考虑这两个文件:

//main1.cpp

int main()
{
    int a = 0;
    int &b = a;
}

//main2.cpp

int main()
{
    int a = 0;
    int *b = &a;
}

当我使用 gcc -S 选项编译它并比较 2 个汇编器输出时,它们是完全相同的输出。那么为什么有些书说引用变量不占用额外的内存呢?

【问题讨论】:

  • 编译器特定的优化也许...
  • “那么为什么有些书说引用变量不会增加内存??”因为他们不知道他们在说什么。获取better book。 (另外,对于像这样的例子,所有的代码可能都被删除了,因为它什么都不做)。
  • 语义上,引用不需要占用内存。他们当然没有地址。但是在后台,如果需要,实现可以使用指针。实现可以做任何它需要的事情,以产生所需的语义。

标签: c++ pointers memory reference


【解决方案1】:

未指定引用是否占用内存。如果编译器可以确定它引用的是哪个对象,那么它可以简单地将引用用作该对象的替代“名称”,而无需任何运行时信息。如果不能,则引用将需要保存其目标地址,就像指针一样。

指针是对象,因此像任何其他对象一样占用内存。然而,“as if”规则下的优化意味着只有在程序的行为依赖于对象的情况下,对象才需要占用内存;例如,如果您打印它的地址。因此,如果编译器可以确定指针指向哪个对象,那么它就可以将通过指针的间接访问替换为对该对象的直接访问,甚至可能完全删除指针。

相同的优化规则意味着,在您的两个示例中,所有变量都可以删除,因为它们没有效果。

【讨论】:

  • 我从你那里看到的最后二十个左右的答案真的很棒。
  • @LightnessRacesinOrbit:谢谢,你这么说真是太好了。
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多