当我试图找到 Pointers 存储自己的位置、它们的地址和地址值时。与References相同。
例一:
int a = 1;
int *b = new int{ 5 };
int &c = a;
我知道
a
和1
是存储在栈上的,但是他们是在同一个内存块吗?
我有信息,引用值
*b
的5
存储在堆栈中,但值5
存储在堆中。
我听说引用 a 的
&c
没有存储在内存中,因为它是别名。但是其他人说的是另一回事,所以和*b
一样的问题,它们是如何存储在内存中的?
我认为深入了解这个话题会更有趣。
例二:
void Func1(int a)
{
// code
}
void Func2(int *b)
{
// code
}
void Func3(int &c)
{
// code
}
我知道参数
a
被复制到堆栈上的函数内存中。
我有信息说
*b
被复制到堆栈上的函数内存,但只复制了 *b
,而不是它对存储在堆中的值的引用。
听说
&c
不要复制,因为函数通过这个引用直接使用位于堆上的值。
例子 1 和 2 在记忆中是如何工作的?
我尝试使用 Google、Bing AI 和 ChatGPT 寻找这个问题的答案,但答案各不相同。
我的编译器是 x64 MSVC 14.35.32215
如您所述,
int
和 int*
类型存储在堆栈中。引用是别名,因此可能不需要任何额外存储,具体取决于编译器实现。
首先,变量的地址只是一个整数。 现在,看看你的第一个例子:
int a = 1;
int *b = new int{ 5 };
int &c = a;
a
在堆栈上,占用 4 个字节。字节以二进制格式表示值1
,此reference可视化整数如何存储在内存中。
关于
b
,你是对的。 b
是一个指针,它在堆栈上有自己的地址,占用 4 个字节(或 8 个字节,具体取决于操作系统,请参见此处 https://learn.microsoft.com/en-us/cpp/cpp/raw-pointers ?视图=msvc-170)。这4个字节代表一个整数值,即5
在堆上的地址(new int{ 5 }
)。
关于
c
,它正是a的别名,C++可能需要内存来帮助程序的其他部分知道别名的存在。
从这里开始,希望你能自己回答你的问题。