【发布时间】: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.x和a.y是一个数组(据我所知,struct complex{int x[2];}将是相同的汇编代码)。但这就是编译器所做的。不是您可以在 C/C++ 代码中使用的。 -
@Matthias:这很有可能,但不能保证。
-
如果你使用 Visual C++,你可以让你的编译器写一个汇编文件,在那里你可以读取你的数据在内存中的样子。 msdn.microsoft.com/en-us/library/367y26c6.aspx 如果你的代码没有优化,数据可能看起来像,我写的。 (但我不能提供任何保证)。如果你的编译器做了一些优化,那么就很难做出任何推测。
标签: c++ memory-address