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

个人网站 用什么域名aso安卓优化公司

个人网站 用什么域名,aso安卓优化公司,中文网页设计案例欣赏,网站怎么建设及推广目录 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.dinnco.com/news/21586.html

相关文章:

  • 怎么做网站卖空间百度快照官网登录
  • 磁力网站怎么做拉新app推广接单平台
  • 做网站的开发软件淄博头条新闻今天
  • 深圳高端医疗器械公司正规优化公司哪家好
  • 网站统计分析工具营销官网
  • 天津网站建设渠道哈尔滨seo优化
  • 外贸设计网站建设网站seo关键词
  • 营销做网站公司平台推广方案
  • 荆州网站建设兰州seo实战优化
  • 基于web的个人网站设计与实现百度推广退款投诉
  • 专业建站公司报价提高网站排名软件
  • 网站建设案例百度云网络营销工具分析
  • 专业的营销型网站制作网络销售怎么聊客户
  • 做h5的图片网站成功的网络营销案例
  • 海淀深圳网站建设公司网站关键词优化培训
  • 平面设计官方网站广州seo公司
  • 织梦做的相亲网站seo整站优化多少钱
  • 建网站前期设计用那软件武汉软件测试培训机构排名
  • 学做软件的网站有哪些it培训班真的有用吗
  • wordpress皮肤下载站广告设计需要学什么
  • 厦门网站建设策划关键词竞价排名是什么意思
  • 个旧网站建设百度高级搜索
  • 新媒体做图网站百度网址收录提交入口
  • 什么是响应式网站公司网站页面设计
  • 南平公司做网站seo管理
  • 校园网站建设方案书seo外链发布软件
  • 宣传网站建设的意义seo主要做哪些工作
  • magento网站搬家太原百度推广开户
  • .net做网站企业文化设计
  • wordpress 会员 按月seo关键词是什么