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

重庆市建设企业诚信分查询网站韦恩图在线制作网站

重庆市建设企业诚信分查询网站,韦恩图在线制作网站,合肥瑶海区封控,单页淘客网站怎么建设目录 1. 主要区别 2. 例释(以Windows X64平台为例) 1. 主要区别 在函数传参中,传引用在本质上就是传地址,而传值调用是利用函数的栈空间进行传递,先将实体复制一份到栈内存,再通过内存栈传递参数。同时,通过传引…

目录

1.   主要区别

2.   例释(以Windows X64平台为例)


1.   主要区别

         在函数传参中,传引用在本质上就是传地址,而传值调用是利用函数的栈空间进行传递,先将实体复制一份到栈内存,再通过内存栈传递参数。同时,通过传引用和传地址的任何对象,如果改动了任何属性,是直接改动原对象,而传值只会改变副本,不会改变原对象。

2.   例释(以Windows X64平台为例)

         为了简单起见,定义一个结构体:

struct DataEntity

{

    __int64 m = 0x1111111111111111; //为了便于观察内存,每一个字节都赋值

    __int64 n = 0x2222222222222222;

    __int64 Add()

    {

        return m + n;

    }

};

定义三个函数,分别按传地址,传引用,传值方式传参:

void PrintPassByReference(DataEntity& data)

{

    __int64 total = data.m + data.n;

}

void PrintPassByPtr(DataEntity* data)

{

    __int64 total = data->m + data->n;

}

void PrintPassByValue(DataEntity data)

{

    __int64 total = data.m + data.n;

}

调用代码:

    DataEntity data;

    PrintPassByReference(data);

    PrintPassByPtr(&data);

    PrintPassByValue(data);

汇编代码分析:

    DataEntity data;

00007FF658FD50A3  lea         rcx,[data] 

00007FF658FD50A8  call        DataEntity::DataEntity (07FF658E56F55h) 

    PrintPassByReference(data);

00007FF658FD50AD  lea         rcx,[data]  ; 将 data 的地址存入寄存器rcx

00007FF658FD50B2  call        PrintPassByReference (07FF658E56F5Ah) 

进入 PrintPassByReference

void PrintPassByReference(DataEntity& data)

{

00007FF658FD4FE0  mov         qword ptr [rsp+8],rcx  ;取出data的地址

00007FF658FD4FE5  sub         rsp,18h 

    __int64 total = data.m + data.n;

00007FF658FD4FE9  mov         rax,qword ptr [data]  ;将data首地址送入rax

00007FF658FD4FEE  mov         rax,qword ptr [rax] 

00007FF658FD4FF1  mov         rcx,qword ptr [data] 

00007FF658FD4FF6  add         rax,qword ptr [rcx+8] 

00007FF658FD4FFA  mov         qword ptr [rsp],rax 

}

00007FF658FD4FFE  add         rsp,18h 

00007FF658FD5002  ret 

    PrintPassByPtr(&data);

00007FF658FD50B7  lea         rcx,[data]  将 data 的地址存入寄存器 rcx

00007FF658FD50BC  call        PrintPassByPtr (07FF658E56F69h) 

;可以看出,在调用方式上与 PrintPassByReference 相同。

进入 PrintPassByPtr(&data);

void PrintPassByPtr(DataEntity* data)

{

00007FF658FD5010  mov         qword ptr [rsp+8],rcx  ;取出data的地址

00007FF658FD5015  sub         rsp,18h 

    __int64 total = data->m + data->n;

00007FF658FD5019  mov         rax,qword ptr [data] 

00007FF658FD501E  mov         rax,qword ptr [rax] 

00007FF658FD5021  mov         rcx,qword ptr [data] 

00007FF658FD5026  add         rax,qword ptr [rcx+8] 

00007FF658FD502A  mov         qword ptr [rsp],rax 

}

00007FF658FD502E  add         rsp,18h 

00007FF658FD5032  ret

从以上可以看出,PrintPassByReferencePrintPassByPtr 生成的汇编代码基本一致,二者都是直接传递数据的地址。

现在看看在进入PrintPassByValue之前的准备:

    PrintPassByValue(data);

00007FF658FD50C1  lea         rax,[rsp+40h]  ;分配 40h 的栈空间

00007FF658FD50C6  lea         rcx,[data]  ;取得 data 的地址

00007FF658FD50CB  mov         rdi,rax  ;  分配的空间地址送入寄存器rdi

00007FF658FD50CE  mov         rsi,rcx  ; data 送入寄存器 rsi

00007FF658FD50D1  mov         ecx,10h  ;计数器值赋为 16 (data大小为16字节)

00007FF658FD50D6  rep movs    byte ptr [rdi],byte ptr [rsi]  ;按字节复制data到新的空间

00007FF658FD50D8  lea         rcx,[rsp+40h]  ;将栈空间地址送入rcx

00007FF658FD50DD  call        PrintPassByValue (07FF658E56F5Fh) 

说明:以上红色部分为新分配栈空间并复制对象副本,这个过程对于 C++ 程序员是隐藏的。

进入 PrintPassByValue

void PrintPassByValue(DataEntity data)

{

00007FF66BA05040  mov         qword ptr [rsp+8],rcx  取出栈中存储的data副本

00007FF66BA05045  sub         rsp,18h 

    __int64 total = data.m + data.n;

00007FF66BA05049  mov         rax,qword ptr [&data]  ;这个data是栈中存储的副本

00007FF66BA0504E  mov         rax,qword ptr [rax] 

00007FF66BA05051  mov         rcx,qword ptr [&data] 

00007FF66BA05056  add         rax,qword ptr [rcx+8] 

00007FF66BA0505A  mov         qword ptr [rsp],rax 

}

00007FF66BA0505E  add         rsp,18h 

00007FF66BA05062  ret 

传值是对副本对应的内存进行操作,当然不会改变原对象。

http://www.yayakq.cn/news/341455/

相关文章:

  • 网站安全在线检测传媒公司排行
  • 殷氏科技网站建设工作室怎样在百度上推广
  • 室内设计与装修杂志广州新站优化
  • 机房建设网站网站建设国内公司
  • 做破解网站合法有没有网站可以学做床上用品
  • 企业建设官方网站的目的佛山附近做网站的公司
  • 品牌网站设计制作服务公司wordpress 纯净版下载地址
  • 医院建网站wordpress可爱的主题
  • 如何韩国视频网站模板下载 迅雷下载地址电商怎么做的步骤
  • 一般制作一个网站要多久wordpress安装配置文件
  • 申请网站域名网站开发的重要性
  • 常州微信网站建设中国建设银行官网下载中心
  • ai做网站步骤大连网站建设哪里好
  • 有一个箭头的做网站的软件网站建设预付
  • 腾讯官网首页登录入口seo网站优化技术
  • 加拿大计划网站怎么做课程网站建设情况
  • 做网站是干什么用的高端网站建设知识
  • 永州企业网站建设自驾游网站建设方案
  • 自己做网站空间中国制造网一级类目
  • 沧州网站建设推广百度竞价代运营托管
  • 交互式网站和非交互式网站成都微信小程序分类信息开发
  • 建筑工程网站建站方案微信运营者和管理员的区别
  • 职业医生继续做学分市哪个网站wordpress 更新 慢
  • wordpress固定链自定义结构网站优化之站外优化技巧
  • 企业网站注册官网怎么用服务器做局域网网站
  • 地方网站全网营销百度怎么提交收录
  • 网站毕设专业app开发制作公司
  • 哈尔滨网站建设排天台建设局网站
  • 湘潭自助建站系统湖南移动网站建设
  • 网站建设软件公司网站域名变了怎么查