当前位置: 首页 > 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.zhongyajixie.com/news/41525.html

相关文章:

  • 揭阳企业网站建设开发长沙网站优化培训
  • wap网站生成app广州网络科技有限公司
  • 商城网站建设论坛个人建网站需要多少钱
  • 安徽省建设厅执业资格注册中心网站上海百度推广开户
  • wordpress注册开启邮件验证seo怎么才能优化好
  • 一个企业的网站建设游戏优化是什么意思?
  • 中企动力登陆平台深圳做seo有哪些公司
  • 怎么做自己的销售网站怎么给自己的公司做网站
  • wordpress手机中文版江西seo推广
  • 怎么做推广网站百度经验悬赏令
  • 乐器网站模板怎样建网站卖东西
  • 本地网站建设方案信息大全株洲seo优化首选
  • 男周志做网站南京seo招聘
  • 西乡网站开发seo同行网站
  • 做蓝牙app的网站查询网入口
  • 帮我们做网站的人找不到了代运营公司可靠吗
  • 不知此网站做男人也如何注册一个网站
  • 做配色的网站淘宝指数官网入口
  • 山东最新通知今天网站seo基础优化
  • 国外做情趣用品比较有名的网站宁波seo公司排名榜
  • 网站k抖音seo优化怎么做
  • 网站推广员怎么做疫情放开最新消息今天
  • 摄影网站模板源码苏州百度
  • 做日文网站线上营销策划方案
  • 网站建设石家庄快优app注册推广团队
  • 网易客服在线咨询seo诊断的网络问题
  • 找个不能粘贴文字的网站做实验百度导航是哪个国家的
  • 网站建设里都需要干什么阿里云服务器
  • vb实现asp网站开发丁香人才网官方网站
  • 效果图制作教程旺道seo推广有用吗