gpt4 book ai didi

c++ - C++ 引用在内存方面的外观如何?

转载 作者:IT老高 更新时间:2023-10-28 12:29:32 25 4
gpt4 key购买 nike

给定:

int i = 42;
int j = 43;
int k = 44;

通过查看变量地址,我们知道每个地址占用 4 个字节(在大多数平台上)。

但是,考虑到:

int i = 42;
int& j = i;
int k = 44;

我们会看到变量 i 确实占用了 4 个字节,但是 j 占用了 nonek 又占用了堆栈上的 4 个字节。

这里发生了什么?看起来 j 在运行时根本不存在。我作为函数参数收到的引用呢? 必须在堆栈上占用一些空间...

而当我们这样做的时候 - 为什么我不能定义一个数组或引用?

int&[] arr = new int&[SIZE]; // compiler error! array of references is illegal

最佳答案

在任何遇到引用 j 的地方,它都会被 i 的地址 替换。所以基本上引用的内容地址在编译时就已经解决了,不需要像在运行时像指针那样解引用。

只是为了澄清我所说的 i 的地址是什么意思:

void function(int& x)
{
x = 10;
}

int main()
{
int i = 5;
int& j = i;

function(j);
}

在上面的代码中,j不应该在主栈上占用空间,而是引用x function 将在其堆栈中占据一个位置。这意味着当以 j 作为参数调用 function 时,i 的地址将被压入 function 的堆栈中强>。编译器可以也不应该在 主堆栈 上为 j 保留空间。

对于数组部分,标准说::

C++ Standard 8.3.2/4:

There shall be no references to references, no arrays of references, and no pointers to references.

Why arrays of references are illegal?

关于c++ - C++ 引用在内存方面的外观如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1179937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com