(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?
我们将在周二为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 的地址。
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 我的 int main() 中出现堆栈溢出错误
- 将大双精度转换为无符号 int 期间堆栈损坏
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- <int> 在不破坏堆栈的情况下获取 C++ 中的堆栈总和
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白
- 如何在不使用堆栈或数组的情况下从INT中提取每个数字?(C )
- 堆栈(int = 10),这个语法是什么意思(C++)
- 关于运行良好的堆栈RPN程序上的char/int
- C++ 堆栈泛型类,int 变量将 32765 作为值而不是 1
- 在 C++ 中实现 int 堆栈
- 在 c++ 中 int 数组周围堆栈损坏错误
- 在c++中添加int数组时,试图找出堆栈损坏的问题
- 在堆栈<int>上使用 std::max_element
- 如何将int转换为const int以在堆栈上分配数组大小
- (C++内存管理)如果我们有一个 int x = 1234,并且 int &y = x...那么堆栈上 y 的地址是什么?