gpt4 book ai didi

C++做引用占用内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:22 31 4
gpt4 key购买 nike

我读到引用只是符号表中存在的变量的别名。考虑以下代码

int main()
{
int y = 6;
int &z = y;
int k = 43;
test(2,y,5,78);
cout << &y << "\n";
cout << &z << "\n";
cout << &k << "\n";
}

void test(int a,int & x, int g, int h)
{
cout << &a << "\n";
cout << &x << "\n";
cout << &g << "\n";
cout << &h << "\n";
}

对于我得到的输出

0039F740
0039F848
0039F748
0039F74C
0039F848
0039F848
0039F830

如果reference在栈中不占内存,为什么会偏移内存。例如。在函数测试中,局部变量a在0039F740,g在0039F748。 g 不应该在 0039F744 吗?

有人能详细解释一下吗?

最佳答案

您的函数有四个参数。

每个参数都必须传递给函数。

其中一个参数是引用这一事实并没有改变这个基本事实。您看到的额外空间是函数的引用参数。

在这种情况下,引用实际上只是一个变相的指针。当您在本地范围内引用本地范围内的对象时,大多数 C++ 编译器实际上会将其优化,以便该引用不会占用任何实际内存。

但是函数调用是一种全新的球类游戏。该函数期望接收对某个对象的引用。该函数无法通过心灵感应知道作为引用传递给它的是什么。无论调用该函数的是什么,都负责提供引用参数。不言而喻,传递该信息需要几个字节,即作为引用传递的对象的地址(我最近提到过关于指针的内容吗?)

如果函数声明为 static 范围(无外部链接),并且为编译选择了足够积极的优化级别,您的 C++ 编译器将内联函数调用,并且能够优化引用参数。

但是声明一个带有外部链接的函数通常会导致编译器懒得尝试内联函数调用。它将继续并生成一个成熟的独立函数,该函数期望拥有它有权使用的每个参数。

以更一般的方式回答您的问题:C++ 标准不要求引用应该占用内存,但也不要求它们不应该占用内存。 C++ 编译器可以自由地以任何方式编译代码,只要结果是正确的,并且符合预期。如果在特定情况下,C++ 编译器想出了如何优化引用,使其实际上不作为其自身的离散对象“存在”,那么它可以自由地这样做。但这不是必需的。

关于C++做引用占用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39481687/

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