专栏名称: 阿布编程
目录
相关文章推荐
财联社AI daily  ·  亚马逊将与SK合作共建韩国最大数据中心 ·  昨天  
财联社AI daily  ·  亚马逊将与SK合作共建韩国最大数据中心 ·  昨天  
dbaplus社群  ·  叛徒CTO:管理和技术其实都不重要 ·  3 天前  
dbaplus社群  ·  叛徒CTO:管理和技术其实都不重要 ·  3 天前  
电动车公社  ·  全固态电池上车,就差临门一脚了? ·  3 天前  
电动车公社  ·  全固态电池上车,就差临门一脚了? ·  3 天前  
51好读  ›  专栏  ›  阿布编程

CPU眼里的:引用

阿布编程  · 公众号  · 科技创业 科技自媒体  · 2025-06-15 09:44

主要观点总结

文章主要讨论了C++中的引用与指针的概念,它们在设计哲学上的差异以及在实际编程中的应用。通过对比引用和指针在CPU指令层面的表现,说明了它们在底层实现上的相似性,同时强调了它们在语法规则上的不同。

关键观点总结

关键观点1: 引用与指针的对比

文章首先对比了引用和指针的功能和用法,指出了它们在语法层面的差异和在CPU眼中的相似性。

关键观点2: 函数中的指针与引用

文章通过示例函数展示了指针和引用在函数参数传递中的实际应用,并解释了它们如何影响函数外变量的值。

关键观点3: 引用与指针的底层实现

文章指出,尽管引用和指针在语法上有许多差异,但在底层实现上,它们有很多相似之处。特别是在LLVM的支持下,不同的编程语言或语法规则背后的机器汇编部分可能无需调整。

关键观点4: 书籍推荐

文章最后推荐了由阿布亲自编写并由多位微软大佬联袂推荐的新书《CPU眼里的C/C++》。


正文

请到「今天看啥」查看全文



或许,你还不能接受这个现实,没有关系。让我们再写一个简单的传指针的函数func3;再写一个传引用的函数func4;最后做一个call函数的调用,如图所示。



如你所见,不仅两个函数func3、func4的函数体,而且它们的调用部分,对应的CPU指令都完全相同!


所以,跟有指针参数的函数func3一样,在函数体func4里面,改变变量r的值,一样会影响到函数外变量a的值。至于指针参数,是如何改变函数外变量a的值?可以参看 “CPU眼里的参数传递” 中的详细讲解。


至此,结论已经非常明显了,在CPU眼里,指针和我们常见的“左值引用”几乎没有任何区别。“左值引用”可以做到的事情,用指针都可以做到。如果非要说说它们的区别的话,我想主要集中在下面这些语法规则的层面:


  1. 引用显得更加简洁,特别是在读、写的时候,不需要像指针那样,加上*号操作。

  2. 指针可以被赋值成NULL:int*p = NULL,但引用不行:int &r = NULL❌。

  3. 指针可以随时改变它所指向的变量;而引用不能随意改变它所引用的变量,否则,会被视为重新定义了一个已经存在的引用变量。

  4. 指针存在“指针的指针”;而引用则不存在“引用的引用”。



03


总结


1. “引用变量”也是变量,在底层实现上面,跟“指针变量”完全相同。


2. “引用变量”也被称为某个变量的别名,这非常形象。但似乎很难解释为什么在函数func4中改变r的值,会同时改变外部变量a的值。但如果你把“引用”当作“指针”看待的话,这个问题就迎刃而解了。



04


热点问题


Q1:C语言也支持:“引用”这个语法规则吗?


A1: 不支持的,引用这个语法规则,是在C++才被支持的。但如你所见,所有的引用,都可以通过指针来达到相同的效果;但引用在使用起来,会简洁不少,更像是一个语法糖。


Q2:引用的本质是“指针常量”吗?例如:int* const p = &a


A2:非常精彩的总结!二者确实有许多相似之处,但它们在语法上也存在一些关键差异。例如,引用不能初始化为nullptr,也不支持间接引用(即 * 操作)。下面是引用与各种指针之间的对比,供大家参考和比较:


特性

引用







请到「今天看啥」查看全文