引用到底有没有内存的分配?

我在浏览博客上,看到有人用反汇编的方法得到了这样一个结论:
引用的内部实现是只读指针,其内存空间存储的是被引用的变量的地址,而“引用没有内存空间的分配”只不过是编译器为了简化问题给程序员做出的假象。

那么鉴于这一点,在传参的时候用引用的避免拷贝所产生的高效性又是如何产生的?
是不是用指针做形参和用引用做形参,在效率上(只从效率上看,不看安全性和可读性)其实没有不同?C++ primer 上关于指针和引用做形参的描述上没直接说效率比较,只是说指针做形参是值传递,涉及到拷贝;而引用做形参是引用传递,不涉及到拷贝。
如果那个结论是对的。那么我可不可以认为用值传递和引用传递来区别函数参数的传递是不准确的,而是应该是类似于:值传递(不包括指针)和地址传递(指针和引用都是)?
如果那个结论是错误的。一个我困恼很久的问题:一个引用如果完全没有内存空间,那么编译器是如何知道他所引用的地址?编译器是用什么将引用的名字和被引用的变量绑定在了一起?

阅读 10.4k
3 个回答

C/C++语言可以说只有值传递,就是你传递的那个东西,是个数字也好,是个指针也好,是个结构体也好(简单结构体都会直接传过去),都是直接复制到栈上的。

而指针就是通过只传递地址值而节省传递一大坨内容的做法。

“引用”在语言层面以下被编译器实现成指针一点都不奇怪。“引用”比指针使用起来更加方便,但是在阅读层面,引用很像是把值全部传递过去了,实际上不是,那只好用”引用传递“来描述这种新的语言特性。

而C++Primer之类书籍的重点是讲解语言,一般是不涉足下面的编译器实现的,所以它的说话也是对的。这就像汽车说明书上说拧钥匙点火启动,你非要拆开汽车说“明明是拧钥匙后接通启动电机用电机把发动机点着的,说明书说的不对“,谁对谁错呢?

这个例子对与对汽车没概念的人也不好。那就是把大象装冰箱吧,语言上就是”把大象装进冰箱“,但是实际行动应该是”打开冰箱门,把大象放进冰箱里,关上冰箱门“,那你说这一连串实际操作是”把大象装进冰箱“么?

引用可以说是占用了内存空间的,但也可以说是没有占用内存空间,怎么说呢?

如文中你提到的,引用存储的是变量的地址,从这个角度来看是“没有重新开辟一块空间来存储数据,是不占用数据存储空间的”;但是会占用空间,占用的是“被引用的变量的地址”。

就像一块地,你写下“XXX国XXX市XXX区XXX街道XXX栋404室“,这块地并没有被占用放置这”404室“,只是放了一个真实位置的地址,暂且叫做”引用“吧。但是却又是占用了地址的,但却占用了很小的一块地方,存那几个字,暂且叫做存实际变量地址吧。

而从上面这个实际例子引申来看,引用会占用很少量的存储空间,也可以直接忽略掉说没有占用存储空间。当然这也是相对的,就像我们通常说的”还不够塞牙缝“,”啊,我的牙齿被塞住了!!!!“

新手上路,请多包涵

c++的引用可以用指针的方式实现,但也可以不用这样:变量i和j都是同一块内存的地址。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题