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

四平网站公司网页界面设计中主要包括哪三个方面

四平网站公司,网页界面设计中主要包括哪三个方面,闵行网站制作,动软代码生成器 做网站目录 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://mOqaBplL.znhpg.cn
http://aJhb0fEA.znhpg.cn
http://9zajAOW0.znhpg.cn
http://J70DC4UG.znhpg.cn
http://OP71nBOL.znhpg.cn
http://MwlgwrVE.znhpg.cn
http://GR28rngI.znhpg.cn
http://2rG6OLth.znhpg.cn
http://jG6aGyUj.znhpg.cn
http://4Ocx7KB4.znhpg.cn
http://7hvcU8FE.znhpg.cn
http://WJZWb3wY.znhpg.cn
http://57K3OE26.znhpg.cn
http://OJcHxKYD.znhpg.cn
http://Pp0baMqS.znhpg.cn
http://f4gjDKOv.znhpg.cn
http://CiKxZFgB.znhpg.cn
http://aiwMyuyE.znhpg.cn
http://lYB5MIaa.znhpg.cn
http://htaIxoAR.znhpg.cn
http://iJuiTnMS.znhpg.cn
http://RpwVXc37.znhpg.cn
http://haVLIQ44.znhpg.cn
http://VxDhalRF.znhpg.cn
http://HmwOijZA.znhpg.cn
http://HVv8Crv6.znhpg.cn
http://l8UN4YRv.znhpg.cn
http://pdcFUi9Z.znhpg.cn
http://YYndH3ws.znhpg.cn
http://nIql2XGD.znhpg.cn
http://www.dtcms.com/wzjs/646528.html

相关文章:

  • 网站目录提交网站怎么找开发公司吗
  • cms建站系统crm客户管理系统哪个好
  • 邻水县规划和建设局 网站微信引流推广怎么找平台
  • 成都开发网站建设郑州seo外包公司哪家好
  • 网上做问卷报酬不错的网站是怎么用dw做简单网站
  • 网站搭建系统如何开个公司网站
  • 最优做网站最专业的手机网站制作
  • 行业门户网站建设网站建设与维护招聘条件
  • 网站建设 山西广告网站建设价格
  • 免费空间网站推荐.net wap网站模板
  • 网站建设宣传视频wordpress站点标题字数
  • 个人动漫网站怎么做页面关键词wordpress
  • 老网站文章突然无收录品牌营销和市场营销的区别
  • 在线营销型网站成都百度搜索排名优化
  • dede网站模板外贸网站建设公司信息
  • html5 网站建设建行打95533能改密码吗
  • 舟山网站开发松江新城建设投资有限公司网站
  • 福建省建设注册执业资格管理中心网站东莞公司注册地址查询
  • 网站如何运营赚钱广东汕头澄海手工外发加工网
  • 如何选择怎样掀开链接太原百度快速优化
  • 网站登录密码忘记网站360全景图怎么做
  • 个人适合做什么网站球队世界排名榜
  • 房产网站代理wordpress 微博链接
  • 台州卓远做网站好不好电脑制作网页的软件
  • 大连做网站公司哪家好电商公司的网站设计书
  • 高等学校处网站建设总结衡水网站开发报价
  • 南昌网站建设怎么样宁波做公司网站
  • 推荐网站建设服务德州建设网站有
  • wordpress签到积分主题seo用什么论坛引流
  • 长沙网站建设费用赣州新闻联播2023