【问题标题】:Where does the reference points to?参考指向哪里?
【发布时间】:2014-12-02 12:37:40
【问题描述】:

我不确定我是否正确理解了堆栈。我有以下运算符 重载复数 a 和 b(a=3+5i 和 b=2+i)。

struct complex{
int x;
int y;
};

complex& operator+=(complex& a, const complex b){
a.x=a.x+b.x;
a.y=a.y+b.y;
return a; 
}

现在我想知道返回值的引用指向哪里。

我认为在主堆栈框架中有一个用于 a = a.x 和 a.y 为 64 位,因为 a.x/a.y 是 int 类型。并且返回值 a 在 operator+=stack-frame 中指向这个“a”内存区域。

我想知道“a”-memory-area 的样子以及 复合类型存储在主堆栈框架中?

它是像一个数组并且引用指向 "a[0]" 还是 a.x 和 a.y 分开,你需要“两个”参考指针来指向一个 复杂类型的对象。

【问题讨论】:

  • 返回的引用根本不 point 任何地方,但它确实 reference 您作为第一个参数传递的任何内容。以及如何实现引用,或如何存储结构,它是特定于实现的,并且可能因编译器而异。为什么结构必须在堆栈上?如果将取消引用的指针传递给堆分配的内存区域会怎样?
  • 不要混淆引用和指针,它们不一样,though they share somewhat related
  • 原则上,您的成员 a.xa.y 是一个数组(据我所知,struct complex{int x[2];} 将是相同的汇编代码)。但这就是编译器所做的。不是您可以在 C/C++ 代码中使用的。
  • @Matthias:这很有可能,但不能保证。
  • 如果你使用 Visual C++,你可以让你的编译器写一个汇编文件,在那里你可以读取你的数据在内存中的样子。 msdn.microsoft.com/en-us/library/367y26c6.aspx 如果你的代码没有优化,数据可能看起来像,我写的。 (但我不能提供任何保证)。如果你的编译器做了一些优化,那么就很难做出任何推测。

标签: c++ memory-address


【解决方案1】:

a 是对用于调用operator += 的变量的引用。

complex w, p;

void f() {
  w.x = w.y = 0;
  p.x = 1; 
  p.y = 0;
  w += p;
}

operator +=上的参数aw的别名,参数bp的别名。

【讨论】:

    【解决方案2】:

    一个复杂对象的内存映射看起来像一个内存地址的集合,它将依赖于实现。数组定义只保证保存一个连续的内存位置。复杂对象的内存布局不需要分配在连续的内存位置。

    运算符重载函数的返回地址应该是根据您的实现的第一个对象复杂对象 a 的地址。

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多