(C++内存管理)如果我们有一个 int x = 1234,并且 int &y = x...那么堆栈上 y 的地址是什么?

(C++ memory management) If we have an int x = 1234, and int &y = x... then what is the address of y on the stack?

本文关键字:int 堆栈 是什么 地址 并且 1234 管理 内存 C++ 如果 我们      更新时间:2023-10-16

我们将在周二为CS期中考试做准备。

我们的教授在网上提供了一些学习材料,包括以下内容:

"此外,您应该能够在给定一些代码的情况下绘制内存图,例如:">

void foo( int &x )
{
 x = 1000;
}
void bar( int *x )
{
 *x = 1000;
}
void foobar( int x )
{
 x = 1000;
}
int main()
{
   int x = 1234;
   int &y = x;
   int *z = &x;
   int  array_1[5];
   int *array_2[5];
   array_1[0] = 10;
   array_2[0] = (int*)10;
   array_2[1] = &y;
   array_2[2] = &x;
   foo( x );
   foo( y );
   foo( *z );
   bar( &x );
   bar( &y );
   bar( z );
   foobar( x );
   foobar( y );
   foobar( *z );
   return 0;
}

我们试图一步一步地浏览它,看看堆栈上分配了什么,堆上分配了什么,以及每件事的价值是多少。

我们不明白的是:&y 保存 x 的地址,但 &y = &x...那么Y的地址是什么?比如,堆栈不需要容纳 y 吗???

长话短说 - 没有勺子y.因此,堆栈上不会为y分配任何内容.这是因为您案例中的y是一个参考。

引用只是一个别名,没有地址。换句话说 - 它与x相同,但名称不同。这就是你应该如何看待引用作为一个C++程序员。事实上,编译器可能会使用对象的地址来实现引用(即当你通过引用传递时(。即使在这种情况下,它也可能只存储在寄存器中,因此没有内存地址。但这些是你不应该知道的实现细节:)我建议您查看此C++参考常见问题解答。

y既不是对象也不是函数,因此它没有地址。 它是对变量x引用,这意味着无论何时使用y就好像您使用了x一样。 请注意,这根本不要求y持有指向x的指针。

在函数main中,y可能根本不存在于生成的可执行文件中;编译器可以简单地替换所有y的使用,就好像它们是x的使用一样。

在您的函数bar中(同样,假设它实际上存在于生成的可执行文件中并且不是完全内联的(,作为引用的 x 确实必须存在于某个地方,因为它必须引用函数范围之外的对象。 此类引用通常作为指针实现,但实现者可以自由地实现他们认为最合适的引用。

将引用视为"只是另一个名称"。换句话说,"y"只是"x"的另一个名称,因此没有地址。

关于 int &y = x;如果你看一个程序集(用 -S 编译(列表,你会发现在许多情况下,x 的地址是本地堆栈上的位置。因此,您可以将该堆栈地址视为 y 的地址。