关于引用与指针,引用的实现

底层剖析引用实现原理(引用是占有内存空间的) 正如《C++ primer》中所述,“引用即别名,它并非对象,相反地,它只是一个已经存在的对象所起的另外一个名字。”刚学习C++的时候,觉得引用就是一个别名,并不会占有内存。剖析了引用的底层实现原理之后,才发现这是错误的,引用也是会占有内存的,且底层是通过指针来实现的。 一、底层剖析引用实现原理 以下是一段对引用和源变量取地址的代码,一起看一下 #include<iostream> using namespace std; int main() { int a = 10; int & 阅读详情

对引用的理解首先是根据《C++ primre》第五版中的解释,其次是我个人根据网上的资料,对C++实现引用本质的理解。下面分为两部分,首先理解引用体现出来的性质,其次是关于引用的具体实现。

1.引用具体表现行为

a.引用的定义:“引用为对象起了另外一个名字,引用类型将引用另外一种类型” —— 《C++ primer》5

也就是说引用本身不是一个对象,而是其初始值的一个别名。

b.引用的行为:

1)程序将引用与其初始值进行绑定,而不是将初始值拷贝到引用

2)一旦初始化完成,引用将与其初始值一直绑定在一起,不能改变

3)引用必须在定义时初始化,因为一旦初始化完成,将不能改变

4)引用只能绑定到对象上,不能绑定到字面值常量或表达式的计算结果上

5)由于引用不是对象,因此不能定义引用的引用,也不能定义引用的指针

c.引用与指针的区别:

1)引用不是一个对象,而指针是对象

2)引用必须在定义时初始化,而指针可以不用,使得 指针的可以被赋值和拷贝,而引用不可以


2.引用的实现

在一篇很好的博文中看到,认为引用是一个const 的指针,且对该指针的操作都会被编译器使用其解引用来替换,而引用对象本身是占内存的,只是体现得好像它仅仅是一个别名,但不存在内存空间一般。

具体如下代码分析:

int i = 1;
int &j = i;
cout << i << " " << j << endl;  // 1 1
cout << &i << " " << &j << endl; //eg: 0x88888888 0x88888888  

经过编译器进行替换后,上述操作变为:

int i = 1;
int *const j = &i;
cout << i << " " << *j << endl;  // 1 1
cout << &i << " " << &*j << endl; //eg: 0x88888888 0x88888888  
因此,就不难理解为什么对引用对象进行操作会出现上述的情况,且分析以下引用的各项要求与 T* const 之间的关系:

1)程序将引用与其初始值进行绑定,而不是将初始值拷贝到引用 —— 将对象的地址放入引用对象中,并没有产生拷贝

2)一旦初始化完成,引用将与其初始值一直绑定在一起,不能改变 —— T * const 对象的值不能改变

3)引用必须在定义时初始化,因为一旦初始化完成,将不能改变 —— const 对象的值必须在初始化时定义

4)引用只能绑定到对象上,不能绑定到字面值常量或表达式的计算结果上 —— 字面值常量可看作临时对象,将指针指向临时对象不安全

5)由于引用不是对象,因此不能定义引用的引用,也不能定义引用的指针 —— 若允许引用的引用,则对引用的一次解引用将不能获取真实想绑定对象的值,不符合引用想要体现的特性,分析代码如下:

int i = 1;
int * const p = &i;             // int & p = i;
int *const *const pp = &p;     // int & pp = p;
cout << *p << *pp << endl;   
//希望的输出结果:
cout << i << i << endl; //希望均是绑定到 i

//事实上输出结果等效于:
cout << i << p << endl; //输出与预想不符


验证:引用是一个对象,其本身是占用空间的,如下代码:
struct ref
{
     int & i;
};

int main()
{
    cout << sizeof(ref) << endl;  //输出4
}
可以看出引用并不单单是一个别名,而是占用内存空间的。个人理解引用是一个 const 类型的指针(注意:不是指向const 对象的指针)。

可以参见一个翻译得很好的博客:点击打开链接

智能指针:弱引用指针的使用与实现 通过互斥锁的加锁和解锁操作,可以确保这些操作的原子性和互斥性,从而避免竞争条件和数据不一致的问题。循环引用指的是两个或多个对象之间相互引用,导致它们的引用计数永远不会达到零,从而导致内存泄漏。通过合理使用智能指针,我们可以提高代码的可靠性和可维护性,避免内存泄漏和其他常见的动态内存管理问题。在C++编程中,智能指针是一种重要的工具,用于管理动态分配的内存和避免内存泄漏。的引用计数不会影响被管理对象的生命周期,因此控制块会一直存在,直到所有的。所管理的对象的弱引用,但并不增加引用计数。的使用方法相对简单。 阅读详情

相关推荐

LIS3DHTR三轴加速度计Arduino驱动与嵌入式集成指南

加速度计是嵌入式系统中实现运动感知、姿态解算和振动分析的核心传感器。其工作原理基于MEMS微机械结构在惯性力作用下的电容变化,经片内ADC转换为数字信号;I²C接口因其硬件资源占用少、布线简洁,成为低功耗物联网节点的主流通信方式。技术价值体现在高分辨率(12位)、多量程(±2g~±16g)与低功耗(待机电流仅2µA)的平衡,支撑电池供电设备长期运行。典型应用场景包括可穿戴设备的姿态识别、工业预测性维护中的振动监测,以及智能硬件的敲击/跌落检测。本文围绕LIS3DHTR芯片及其Grove模块,详解Arduin

weixin_42584758的博客 595

C++ 引用 指针

引用:为对象起一个名字,引用类型引用另外一种类型。 例如: int reference = 100; int &another = reference; 一般的,初始化变量时,初始值会被拷贝到创建的新对象中。 However,引用时并不是将初始值拷贝给引用。引用将一直和初始值对象绑定在一起。 Note:引用只是已存在对象的另一个名字(它不是一个对象) 对引用赋值,相当于对绑定对象赋值。 Note:引用的初始值必须是对象(不能是一个值) 例:int &...

ryankaros的博客 3284

MIPI信号的分析--结合示波器实际测试波形

如果排查的思路对你有帮助,请记住 消雨匆匆 or 大吊工。码字和排查很累,仅此而已 ,硬件不是抄电路,拿烙铁,懂点软件,细致分析,找问题和破案搜集线索是一样的。 部分内容来自于此博客的大神总结: http://www.elecfans.com/news/wangluo/20170323499614.html http://www.elecfans.com/yuanqijian/jieko...

消雨匆匆 4万+

通过指针引用字符串

字符串的引用方式 在c语言中,字符串是存放在字符数组中的,想要引用一个字符串,有两种方法: (1)、用字符数组存放一个字符串,通过数组名和下标引用字符串的一个字符,也可以通过 数组名(即首元素地址)和格式声明“%s”输出该字符串。 #include <stdio.h> #include <stdlib.h> int main() { char string[]="I love China!"; printf("%s\n",string); printf("%c\n",

qq_56012411的博客 2289

Halcon深度图转伪彩图

Halcon深度图转伪彩图

Quintin 3934

UniApp实战:5分钟搞定极光推送(JG-JPush)从配置到消息测试全流程

本文详细介绍了如何在UniApp中快速集成极光推送(JG-JPush),从基础配置到核心代码实现,再到双端调试技巧和高级功能扩展。通过5分钟全流程指南,开发者可以轻松实现消息推送功能,提升应用的用户触达率。

sat99的博客 682

C语言--通过指针引用数组

指针不仅可以指向变量,也可以指向数组,数组元素在内存中占用存储单元,因此他们都有相应的地址,用指针指向数组元素就是数组元素的地址。//定义5个整型数据的数组a int * p;//定义一个整型变量的指针 p = & a [ 0 ];//把a[0]的地址赋给指针p数组名代表数组的首地址,序号为0的元素,也代表数组的首地址//P的值是a[0]的地址 等价于p = a;//p的值是数组a首元素(即a[0])的地址数组名仅仅代表数组首元素的地址对指针变量进行初始化等价于 int * p;

weixin_45913886的博客 1106

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560

C++ —— 理解引用及其原理

概念 引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。 底层实现 在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。 我们借助代码进行探索 int i=5; int &ri=i; ri=8; 通过:调试->窗口->反汇编 int i=5; 00A013DE mov dword

ifwecande的博客 1637

【JTAG】1500协议详解

随着集成电路的规模不断扩大,1149.1的板级测试无法满足要求越来越高的芯片测试需求。芯片规模变大后,测试需求不在是一次测试整片芯片,而是芯片分为好几个区域去测试,而1500协议正是对1149.1在该方面的一个补充即1149.1主要测试板级间的互连,而1500用来测试芯片内不同core之间的互连。IEEEStd1500已经为包含不同模块的集成电路(ICs)开发了一种可测试性设计标准方法。............

xuhe0206的博客 7022

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1718

指针与引用的实现细节原理及如何选用

对指针和引用不熟悉的可以看我前面的两篇文章

wonghifong0223的博客 1091

Python内置函数zip()——《Python内置函数手册》Python老吕编著

zip()函数是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。zip()函数常用于将多个序列并行迭代,或者用于数据对齐。zip()它返回一个迭代器,这意味着你可以逐个获取打包后的元素,而不是一次性将所有元素加载到内存中。如果输入的可迭代对象长度不一致,zip()会以最短的可迭代对象为准,只打包到最短对象的末尾。它可以用来并行迭代多个序列,使得代码更加简洁和高效。在接下来的章节中,我们将详细介绍。

Python老吕的博客 680

指针与引用的区别,指针与引用的底层实现是否一样?

指针与引用,在More Effective C++ 的条款一有详细讲述, 条款一:指针与引用的区别  指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果

lingfengtengfei的专栏 3927

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

引用与指针在底层实现研究

这个题目最初是学弟问我的

南浦 1502

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++引用与指针深度对比:从底层实现到最佳实践

在C++编程中,理解内存管理和对象访问机制是提升代码质量的核心。引用作为C++的重要特性,本质上是对象的别名,通过编译器底层通常以指针方式实现,但提供了更安全、更直观的语法约束。从技术原理看,引用必须初始化且不能为空,消除了空指针风险,同时编译器能基于其不可重绑定的特性进行激进优化,甚至消除间接访问开销。在工程实践中,引用在函数参数传递、返回值优化以及现代C++的移动语义中发挥着关键作用,特别是在处理大型对象和实现资源高效转移时。结合C++11引入的右值引用,引用机制进一步支撑了移动语义和完美转发等高级特性

weixin_33735077的博客 361

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++引用与指针的区别及引用的底层实现

引用的特点: ①一个变量可取多个别名。 ②引用必须初始化。 ③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。 使用引用时须注意: (1)&amp;amp;在这里不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他...

莫问收获,但问耕耘 1701

指针与引用(gcc如何实现引用的)

首先,变量名在编译成汇编语言的时候,会被翻译成地址。  例如 : void square() { int var = 0; } 会被翻译成 : square(): push rbp mov rbp, rsp mov DWORD PTR [rbp-4], 0 nop ...

RT_776的博客 604

C++-引用:引用的本质【引用的本质在c++内部实现是一个指针常量】【编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见】

c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。

u013250861的博客 241

关于智能指针,引用计数的学习与实现

自从用过boost的智能指针:shared_ptr之后,一直对引用计数这种东西很好奇,想知道它是如何实现的,尤其是一个ptr改变了引用计数,如何能够即时的让其他的ptr知道; 曾经想过一些方法,比如说:对象之间是独立的,唯一能把各个对象之间联系到一起的就是类,那么就从类的静态成员上着手,于是我就想到了在静态成员变量上创建一个map: static std::map ms_UseCo

scd8511094的专栏 841

指针与引用实现多态

引用是除指针外另一个可以产生多态效果的手段。 #include using namespace std; class A { public:  virtual void print()  {   cout  } }; class B:public A { public:  void print()  {   cout  } }; void main() {

3758

指针与引用实现两数交换

指针与引用实现两数交换

weixin_74018823的博客 975

指针 是否相同_简谈 C++ 中指针与引用的底层实现

引用是C++相对于C而引入的一个重要特性,它使得许多地方的语法变得更加简洁,但是它们的底层究竟是怎么实现的呢?在Wikipedia中,对指针有如下介绍: In computer science, a pointer is a programming language object that stores the memory address of another value located in ...

weixin_39747049的博客 149

python如何实现类似指针概念_对比 C++ 和 Python,谈谈指针与引用

花下猫语:本文是学习群内 樱雨楼 小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时,我谈些什么?》,大受好评。本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念。祝大家读有所获,学有所成! 樱雨楼 | 原创作者豌豆花下猫 | 编辑润色本文原创并首发于公众号【Python猫】,未经授权,请勿转载。0 引言指针(Pointer)是 C、C++ 以及 Java、Go 等语言的...

weixin_39649490的博客 692

关于引用与指针实现多态的一些记录

首先明白指针的组成,指针是由一个其指向的地址值和对该地址值得解释方式两部分组成。 p1:指向基类的指针, p2:指向派生类的指针 p1 = p2; 当将一个派生类的指针赋给一个基类指针时,p2的地址被完全复制给p1,两者拥有相同的地址,但是对于这个地址的解释方式对于p1来说还是p1原有的解释,那在通过p1调用一个虚函数时,通过p1对地址的解释找到对应的虚表指针...

weixin_30307267的博客 140
上一篇: 仿函数存在的原因
下一篇: C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值