当前位置: 首页 > news >正文

公司做网站需要什么资料百度关键词搜索查询

公司做网站需要什么资料,百度关键词搜索查询,淄博网站制作公司服务,wamp和wordpressC中的this指针一直比较神秘。任何类的对象,都有一个this指针,无处不在。那么this指针的本质究竟是什么?this指针什么时候会被用到?今天通过几段简单的代码,来揭秘一下。 要先揭秘this指针,先来说一下函数调…

C++中的this指针一直比较神秘。任何类的对象,都有一个this指针,无处不在。那么this指针的本质究竟是什么?this指针什么时候会被用到?今天通过几段简单的代码,来揭秘一下。

要先揭秘this指针,先来说一下函数调用时参数的传递过程。考虑以下代码:

int sum(int i, int j, int k)
{return i + j + k;
}int main()
{int a, b, c;a = 1;b = 2;c = 3; sum(a,b,c);return 0;
}

这是一段非常简单的函数调用代码。我们生成其汇编代码(x86-64),如下所示:

sum(int, int, int):pushq   %rbpmovq    %rsp, %rbpmovl    %edi, -4(%rbp)movl    %esi, -8(%rbp)movl    %edx, -12(%rbp)movl    -4(%rbp), %edxmovl    -8(%rbp), %eaxaddl    %eax, %edxmovl    -12(%rbp), %eaxaddl    %edx, %eaxpopq    %rbpret
main:pushq   %rbpmovq    %rsp, %rbpsubq    $16, %rspmovl    $1, -4(%rbp)movl    $2, -8(%rbp)movl    $3, -12(%rbp)movl    -12(%rbp), %edxmovl    -8(%rbp), %ecxmovl    -4(%rbp), %eaxmovl    %ecx, %esimovl    %eax, %edicall    sum(int, int, int)movl    $0, %eaxleaveret

我们重点来关注一下函数参数的传递过程。通过分析main函数的汇编函数, 我用类似于C语言的伪代码解释了一下每一行的意思,辅助理解,如下所示。

main        pushq   %rbpmovq    %rsp, %rbp      //rbp = rspsubq    $16, %rsp       //rsp -= 16movl    $1, -4(%rbp)    //*(rbp-4) = 1movl    $2, -8(%rbp)    //*(rbp-8) = 2 movl    $3, -12(%rbp)   //*(rbp-12) = 3movl    -12(%rbp), %edx //edx =*(rbp-12)movl    -8(%rbp), %ecx   //ecx =*(rbp-8) movl    -4(%rbp), %eax   //eax = *(rbp-4)movl    %ecx, %esi    //esi = ecx movl    %eax, %edi   //edi = eaxcall    sum(int, int, int)movl    $0, %eaxleaveret

在执行这条指令(call sum(int, int, int))前,main函数的栈空间分布如下:

即main函数会存储三个变量: a, b, c. 同时会将其值分别赋值给edi, esi、edx寄存器。那么我们很好奇,将a, b, c三个变量的值赋值给edi, esi、edx寄存器会有什么用呢?我们先来看一下sum函数,我用类似于C语言的伪代码解释了一下每一行的意思,辅助理解,如下所示。

sum(int, int, int):pushq   %rbpmovq    %rsp, %rbp         //rbp = rspmovl    %edi, -4(%rbp)     //*(rbp-4) = edimovl    %esi, -8(%rbp)     //*(rbp-8) = esimovl    %edx, -12(%rbp)    //*(rbp-12) = edxmovl    -4(%rbp), %edx     //edx = *(rbp-4)movl    -8(%rbp), %eax     //eax = *(rbp-8)addl    %eax, %edx         //edx += eax  movl    -12(%rbp), %eax    //eax = *(rbp-12) addl    %edx, %eax         //eax += edx popq    %rbpret

sum函数的栈空间分布如下:

 

我们重点关注一下这几条指令:

 movl    %edi, -4(%rbp)     //*(rbp-4) = edi
 movl    %esi, -8(%rbp)     //*(rbp-8) = esi
 movl    %edx, -12(%rbp)  //*(rbp-12) = edx

可以看到,在sum函数的栈空间中,其会分配三个存储单元,rbp-4, rbp-8, rbp-12存储1,2,3。而1,2,3这三个值分别又是从edi,  esi、edx三个寄存器中拷贝过来的。而这三个寄存器的值又是来自main函数中a, b, c三个变量的赋值。也就是说,这里edi,  esi、edx三个寄存器,在函数调用时,完成了参数的传递。那么这种参数传递的现像是不是有什么约定呢? 答案是有的!

在Linux/macOS 等 Unix-like系统中,函数的调用约定标准为System V AMD64 ABI,其参数传递机制:

参数位置整数/指针寄存器浮点寄存器
第 1 个RDIXMM0
第 2 个RSIXMM1
第 3 个RDXXMM2
第 4 个RCXXMM3
第 5 个R8XMM4
第 6 个R9XMM5
第 7+ 个栈(右→左)XMM6-7

从这个约定中得知,在传递整数时,第一个参数用的是RDI寄存器,第二个参数用的是RSI寄存器,第三个参数用的是RDX寄存器。上面函数调用的例子中正好符合此调用约定(例子中用的是edi,  esi、edx三个寄存器传递第1,第2,第3个参数,而edi,  esi、edx正好是RDI、RSI、RDX三个寄存器的低32位)。

<this指针揭秘继续...>

 

 

 

http://www.dtcms.com/a/457116.html

相关文章:

  • 母婴微网站设计规划中国最新新闻头条
  • 2025-10-08 Python 标准库 9——内置类型:其他
  • Oracle实战:相同批次下D5_D10最新数据整合为一行的3种方案
  • 私人精品货源网站有哪些php网站开发前端
  • 金融 - 搭建 图谱挖掘工作流 调研
  • 图像分割关于DualSeg,FFM和CFM的论文学习
  • Spring的 `@Import`注解 笔记251008
  • 【玩泰山派】4、制作ubuntu镜像-(6)使用鲁班猫的sdk去制作镜像
  • 长兴县住房和城乡建设局网站我想看黄牌
  • 深入理解 Reactor 反应堆模式:高性能网络编程的核心
  • php做小公司网站用什么框架医药招商网站大全免费
  • 从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
  • 哪里可以做足球网站虚拟主机 2个网站
  • 建设银行的英语网站首页dede导入wordpress
  • 支付宝小程序 MAU 增长新路径:生态工具与流量闭环的协同实战
  • C++ 成员初始化列表
  • 三门县住房和城乡建设规划局网站商业网站是怎么做的
  • Spring Security 最简配置完全指南-从入门到精通前后端分离安全配置
  • Go泛型实战指南:从入门到工程最佳实践|Go语言进阶(12)
  • easyexcel实现excel读取
  • 用jsp实现网站开发实例高校网站站群建设公司
  • 个人网站导航html源码团购网站模板
  • wpf之RelativeSource用法总结
  • 【C语言基础详细版】06. 动态内存管理:从原理到实战应用
  • 磁悬浮轴承转子不平衡质量控制深度解析
  • 关于力扣2025.10.8每日的收货
  • 烟台做网站的价格网络工程是冷门专业吗
  • 亲测可用,R语言 ggplot2 箱线图线条控制参数详解,箱线图离散数值控制
  • 沙漠风网站建设公司太原不错的互联网公司
  • 记录thinkphp模型查询时select与count执行顺序的疑问