TFK*_*TFK 6 c++ reference pass-by-reference
我读过引用只是符号表中存在的变量的别名。考虑下面的代码
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";
}
Run Code Online (Sandbox Code Playgroud)
对于我得到的输出
0039F740
0039F848
0039F748
0039F74C
0039F848
0039F848
0039F830
Run Code Online (Sandbox Code Playgroud)
如果引用不占用堆栈中的内存,为什么内存会被偏移。例如。在功能测试中,局部变量a位于0039F740,而g位于0039F748。g 不应该在 0039F744 吗?
有人可以深入解释一下吗?
您的函数有四个参数。
每个参数都必须传递给函数。
其中一个参数是引用这一事实并没有改变这一基本事实。您看到的额外空间是函数的引用参数。
在这种情况下,引用实际上只是一个伪装的指针。当本地作用域中有一个引用本地作用域中的对象时,大多数 C++ 编译器实际上会对其进行优化,以便该引用不会占用任何实际内存。
但函数调用是一种全新的游戏。该函数期望接收对某个对象的引用。该函数无法通过心灵感应知道传递给它的引用是什么。无论调用该函数的是什么,都负责提供引用参数。不用说,需要几个字节来传递该信息,即作为引用传递的对象的地址(最近我是否提到过有关指针的内容?)
当然,如果函数是使用static作用域声明的(无外部链接),并且选择了足够积极的优化级别进行编译,则 C++ 编译器将内联函数调用,并能够优化引用参数。
但是声明具有外部链接的函数通常会导致编译器不费心尝试内联函数调用。它将继续并生成一个成熟的独立函数,该函数期望拥有它有权使用的每个参数。
以更一般的方式回答您的问题:C++ 标准不要求引用应该占用内存,但也不要求它们不应该占用内存。C++ 编译器可以自由地以任何方式编译代码,只要结果正确并且符合预期。在特定情况下,如果 C++ 编译器弄清楚如何优化引用,以便它实际上不会作为自己的离散对象“存在”,那么它可以自由地这样做。但并不需要这样做。
| 归档时间: |
|
| 查看次数: |
2220 次 |
| 最近记录: |