我在浏览博客上,看到有人用反汇编的方法得到了这样一个结论:
引用的内部实现是只读指针,其内存空间存储的是被引用的变量的地址,而“引用没有内存空间的分配”只不过是编译器为了简化问题给程序员做出的假象。
那么鉴于这一点,在传参的时候用引用的避免拷贝所产生的高效性又是如何产生的?
是不是用指针做形参和用引用做形参,在效率上(只从效率上看,不看安全性和可读性)其实没有不同?C++ primer 上关于指针和引用做形参的描述上没直接说效率比较,只是说指针做形参是值传递,涉及到拷贝;而引用做形参是引用传递,不涉及到拷贝。
如果那个结论是对的。那么我可不可以认为用值传递和引用传递来区别函数参数的传递是不准确的,而是应该是类似于:值传递(不包括指针)和地址传递(指针和引用都是)?
如果那个结论是错误的。一个我困恼很久的问题:一个引用如果完全没有内存空间,那么编译器是如何知道他所引用的地址?编译器是用什么将引用的名字和被引用的变量绑定在了一起?
C/C++语言可以说只有值传递,就是你传递的那个东西,是个数字也好,是个指针也好,是个结构体也好(简单结构体都会直接传过去),都是直接复制到栈上的。
而指针就是通过只传递地址值而节省传递一大坨内容的做法。
“引用”在语言层面以下被编译器实现成指针一点都不奇怪。“引用”比指针使用起来更加方便,但是在阅读层面,引用很像是把值全部传递过去了,实际上不是,那只好用”引用传递“来描述这种新的语言特性。
而C++Primer之类书籍的重点是讲解语言,一般是不涉足下面的编译器实现的,所以它的说话也是对的。这就像汽车说明书上说拧钥匙点火启动,你非要拆开汽车说“明明是拧钥匙后接通启动电机用电机把发动机点着的,说明书说的不对“,谁对谁错呢?
这个例子对与对汽车没概念的人也不好。那就是把大象装冰箱吧,语言上就是”把大象装进冰箱“,但是实际行动应该是”打开冰箱门,把大象放进冰箱里,关上冰箱门“,那你说这一连串实际操作是”把大象装进冰箱“么?