c++“引用”的概念,它是如何被编译的?
我现在只知道引用相当于对某对象创建了一个别名,操作时可以直接操作,但是并不太理解:
那么返回引用的函数呢,难道返回的是一个
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; }
- 在处理引用的过程中,编译器做了什么事情?既然引用不占用内存空间,以后如何记录引用的位置?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
引用内部编译为指针常量。引用会占空间。
所谓引用不占空间是发生了常量折叠的效果。
foo(n)
即为glob[n]
。2. 你的函数返回值为引用,则它不属于对返回对象的拷贝,所以不占用额外内存。通俗点说你的foo
基本上等于这两句话:首先,C++里面所有你看到的变量都是放在内存或者CPU寄存器,如果在内存,则可以通过地址访问,在C语言里面定义为指针。
其次,C++的引用是为了简化指针操作,但本质上跟指针发挥着相同的作用。(这就是为什么使用引用有些需要注意的地方,譬如不要返回局部变量的引用)。
最后,C++引用与指针同源,那么对编译器来说,就按指针的处理方式就可以了。也就是说,引用的值(其实就是地址)可以放在任意内存或者寄存器里面。
下面来分析你的程序。
所以,为什么引用不占内存还能当左值?好用的指针而已。
你把引用理解为指针就好了.
占不占空间的, 不用管它, 毕竟不是做嵌入式开发, 内存都很珍贵.
N4687
11.3.2 Reference
所以
指针不占空间
这个说法是unspecificed
的, 意思就是无论占不占都是合理的, 可能同一个程序这里占了, 那里不占也行.而具体编译器的实现自然也是有自己的优化啊. 引用下幻の上帝6年前在这里的说法: