c++“引用”的概念,它是如何被编译的?

发布于 2022-09-06 06:19:52 字数 480 浏览 24 评论 0

我现在只知道引用相当于对某对象创建了一个别名,操作时可以直接操作,但是并不太理解:

  1. 那么返回引用的函数呢,难道返回的是一个int&的对象吗,能做左值(惊了)?函数返回的不是量,这个把我搞晕了...写了一小段程序,能跑,但是不知道对不对

    int glob[10];
    
    int &foo(int n) 
    {
        return glob[n];
    }
    
    int main()
    {
        foo(1)=1;
        foo(2)=2;
        cout<<foo(1)<<endl<<foo(2)<<endl;
        cout<<glob[1]<<endl<<glob[2]<<endl;
    }
  2. 在处理引用的过程中,编译器做了什么事情?既然引用不占用内存空间,以后如何记录引用的位置?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

似梦非梦 2022-09-13 06:19:53

引用内部编译为指针常量。引用会占空间。
所谓引用不占空间是发生了常量折叠的效果。

给不了的爱 2022-09-13 06:19:53
  1. 你的glob本身是全局变量,即使foo函数运行结束,它并不会在内存中销毁,而正好你的foo返回值是glob字段中的一个地址,所以简单来说foo(n)即为glob[n]。2. 你的函数返回值为引用,则它不属于对返回对象的拷贝,所以不占用额外内存。通俗点说你的foo基本上等于这两句话:
    int n = 1;
    glob[n] = 1;
浮华 2022-09-13 06:19:53

首先,C++里面所有你看到的变量都是放在内存或者CPU寄存器,如果在内存,则可以通过地址访问,在C语言里面定义为指针。
其次,C++的引用是为了简化指针操作,但本质上跟指针发挥着相同的作用。(这就是为什么使用引用有些需要注意的地方,譬如不要返回局部变量的引用)。
最后,C++引用与指针同源,那么对编译器来说,就按指针的处理方式就可以了。也就是说,引用的值(其实就是地址)可以放在任意内存或者寄存器里面。

下面来分析你的程序。

int glob[10];             // 进程全局变量区,地址是变量 glob
int &foo(int n)     
{
    return glob[n];       // 引用变量 glob + n 的地址
}
int main()
{
    foo(1)=1;             // 相当于 int* a = glob + 1, *a = 1
    foo(2)=2;             // 相当于 int* a = glob + 2, *a = 2
    cout<<foo(1)<<endl<<foo(2)<<endl;        // foo(1) 相当于 int* a = glob + 1; *a
    cout<<glob[1]<<endl<<glob[2]<<endl;      
}

所以,为什么引用不占内存还能当左值?好用的指针而已。

三人与歌 2022-09-13 06:19:53

你把引用理解为指针就好了.
占不占空间的, 不用管它, 毕竟不是做嵌入式开发, 内存都很珍贵.

何以笙箫默 2022-09-13 06:19:52

N4687

11.3.2 Reference

4. It is unspecified whether or not a reference requires storage (6.7).

所以指针不占空间这个说法是unspecificed的, 意思就是无论占不占都是合理的, 可能同一个程序这里占了, 那里不占也行.

而具体编译器的实现自然也是有自己的优化啊. 引用下幻の上帝6年前在这里的说法:

可能各人理解的意思有点不一样……不过我还是倾向于照字面理解。
说它占空间,或者说具有存储,是不强调究竟占内存还是占寄存器的……(register不也是算storage class specifier么。)这样就没问题了吧。
总结:
引用可以占空间,只不过没法通过常规访问对象的方式对它的内容进行操作,但可以包装成对象后转换类型来绕过这个限制;
占了空间的引用和对象一样可能从内存中被优化掉放到寄存器中;
对于某些引用可能在编译期确定它自身的内容,那么运行时就不占空间(不算代码段之类)。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文