c++引用的本质(反汇编角度分析)

2024-06-10 13:44

本文主要是介绍c++引用的本质(反汇编角度分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 一、引用基础理论

二、 引用的本质

三、从反汇编角度进行分析 

1.变量赋值

2.引用和指针初始化

3.通过引用和指针赋值

4.eaxd的作用


 一、引用基础理论

        在c++中我们都知道,引用(&)就是变量的一个别名,它允许我们为已存在的变量创建一个新的名字。

        引用的作用:引用和它所引用的变量共享同一块内存地址。当对引用进行修改时,实际上是对它所引用的变量进行修改,因为两者指向的是同一块内存空间。

二、 引用的本质

如图所示:

三、从反汇编角度进行分析 

分析这行代码:

int a = 10;  
a = 12;  int& b = a;  
int& c = a;  
int* d = &a;  b = 18;  
c = 18;  
*d = 6;  

反汇编代码角度分析:

1.变量赋值
int a = 10;
0052182F  mov         dword ptr [a],0Ah  a = 12;
00521836  mov         dword ptr [a],0Ch  

        这两行代码通过直接内存操作(mov dword ptr [a], value)来设置a的值,可以理解为dword ptr [a]为变量a的地址,oAh为十六进制,这里指把a的地址赋值为10。

2.引用和指针初始化
 int& b = a;
0052183D  lea         eax,[a]  
00521840  mov         dword ptr [b],eax  int& c = a;
00521843  lea         eax,[a]  
00521846  mov         dword ptr [c],eax  int* d = &a;
00521849  lea         eax,[a]  
0052184C  mov         dword ptr [d],eax  

         这里可以看到引用和指针的反汇编代码都是一样的写法,可以得出引用就是一种被阉割的指针,只不过相比于指针而言,它的功能没有那么全。

代码解析:

         这三行代码通过lea eax, [a]指令将a的地址加载到eax中,然后将这个地址存储到b和c中(尽管在汇编级别,它们可能只是内存中的连续字节)。eax在这里用作中间存储地址的寄存器

3.通过引用和指针赋值
  b = 18;
0052184F  mov         eax,dword ptr [b]  
00521852  mov         dword ptr [eax],12h  c = 18;
00521858  mov         eax,dword ptr [c]  
0052185B  mov         dword ptr [eax],12h  *d = 6;
00521861  mov         eax,dword ptr [d]  
00521864  mov         dword ptr [eax],6  

代码解析:

        首先通过mov eax, dword ptr [b/c/d]将引用b或c,d所指向的地址加载到EAX中,然后通过mov dword ptr [eax], 12h将值18(在十六进制中为12h)存储到该地址所指向的内存位置。

4.eaxd的作用

        在这个例子中,eax被用作一个中间寄存器,用于存储地址值,以便在后续的内存操作中使用。这是汇编语言中常见的模式,因为寄存器提供了快速访问和操作数据的方式。

这篇关于c++引用的本质(反汇编角度分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048329

相关文章

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3