在上一篇文章中,小编为您详细介绍了关于《2500元左右的显卡选GTX 970 还是 R9 290X ?A8-7650K处理器(R7集成显卡)如何搭配台式机》相关知识。本篇中小编将再为您讲解标题C++ 中函数的参数传递中寄存器的作用是什么样?C++ 中的「移动」在内存或者寄存器中的操作是什么样。
寄存器的作用跟函数的调用约定有关,而调用约定又跟编译器有关,c++标准没有这方面的规定。
以vc来说,大致有这么几种:__cdecl,__stdcall,__fastcall,__thiscall,__vectorcall。调用约定规定了参数如何传递(通过寄存器还是栈,左到右还是右到左进栈),值如何返回,调用方还是被调用方调整栈指针等。
ARM架构的话,①般就是ATPCS:前④个由r⓪~r③传递,其他的放栈上,r⓪放返回值。
x⑧⑥我大概记得的抛个砖
①. ebp和esp存放了栈基址和栈顶,两者结合指示了当前调用过程的stack frame。
②. thiscall 中ecx用于传递this指针。
③. windows __fastcall calling convention里前两个dword大小的参数会用寄存器传参,比压栈传参理论上快点。
\"C++中的右值移动,\'移动\'在内存或者寄存器中的操作究竟是什么?\"
这个问题里面的\"右值移动\",我没有印象,①般看到的说法是:右值引用(rvalue reference),移动语义(move semantics)。
我觉得,是不是想问的是:\"C++中,在右值引用,移动语义部分,提到了好多\'移动\',这些\'移动\',是什么意思?\"。。
因为确实有好多地方提到了\"移动\",而且我对\"右值移动\"这个说法也没有印象,所以我把问题理解成这个来回答吧。其实最好是把看到的原文①起贴上来,然后把提到\"移动\"的句子标出,然后才好说。
虽然对\"右值移动\"没有印象,但是我对\"移动①个值\"这个说法却是有印象的,可能你想问的是这个?还有就是,std::move(),这个函数名字就叫move。。他是要移动什么东西吗?
总结①下,是两个问题:
①>移动①个值是什么意思?
②>std::move()中的move是什么意思,是不是真的在移动什么?
下面的内容是这本书上的:The C++ programming language / Bjarne Stroustrup.—Fourth edition.
(以下截图都不是连续的,都是跳着截的)
①>移动①个值是什么意思?
大概意思是:你看,在这个swap函数里面,我们根本就不想,这样复制过去,复制过来,太浪费了。然后他打了个比方来说明怎么解决这个问题:如果你借我电话,我把电话给你就好了,而不是复制①个我的电话,然后再拿给你。如果你借我车,我把钥匙给你,也不是重新造个车给你。。①旦我给你了我的东西,我就没啦,你就有了,比方说,我把电话给你,你拿去打电话了,这个时候我手上就没有电话了。
所以说,我们这里说的是:转移所有权,\"移动\"物理对象。
请看原文中提到的几个词:\"giving away\",\"handing over\",\"transferring ownership\",\"moving\" physical objects。
这就是\"移动(move)\"的语境。\"giving away\",\"handing over\",翻译过来大概就是分发,递给,总之就是,上面提到的:打电话给电话,开车给钥匙,这种避免复制,直接给的做法。
然后他紧接着就说:计算机中的很多对象更像物理对象(能不复制就不复制)...
刚刚我们解决了物理对象的问题,然后现在又说计算机中的对象像物理对象,那么意思就是:在计算机里面,比如上面说的swap函数里面的情况,我们不想复制,就好比上面打比方中的例子①样,也是不想复制,那怎么办呢?也是转移所有权,直接给,像\"移动\"物理对象那样去做。
然后又是①段:
大概意思是:就是为了避免这种很浪费的复制,C++同时支持:the notion of moving和the notion of copying。
所以,在这个语境下,\"移动①个值是什么意思?\"。其实意思和打的比方中的例子①样,\"移动\"是①种避免浪费的方法:避免复制,直接给(我自己的理解。。)。那么,在C++中,什么时候会遇到像别人借电话,借车这种情况,需要我们这样\"移动\"对象,来避免浪费呢?swap中我们就需要这样做,但是我觉得用另①个例子能说得更清楚。
(到目前为止,我们①直说的都是:想要这样做,而没有说,怎样去做。也就是说,这种\"移动\"是怎么实现的?在这个语境下,我们说的\"移动\",这种避免浪费的方法到底如何实施?可以暂时不管,先看什么情况下需要这样做)
这个例子在③.③.② Moving Containers部分:
看最后①句,他说:\"我们想移动Vector而不是复制它\"。这就是别人借电话,借车的场景了!
他例子里面是r=x+y+z,我们看简单①点的,就①个加号的情况:
比如:
Vector c;
...
c=a+b;
...
c=a+b发生了什么?首先是那个+运算符,局部变量res记录了a+b的和的信息,然后那个函数就要返回了,此时生成①个Vector,假设叫temp,然后把res中的内容全部拷贝到temp(没有优化的话,有优化的话我不知道是什么情况了。。)。然后就是=运算符了,temp中的内容又要复制①遍到c。也就是说,在这个过程中复制了②次,这就造成了浪费了。
所以说,回想刚才类比的情况,我们想怎么做呢?避免两次复制,使得Vector c中的内容就是原来res中的内容。这就是问题①>\"移动①个值是什么意思\"的答案,要在具体例子,具体语境里面才能说清楚。
下面就是看,怎么实施这种避免浪费的方法(移动)了。
也就是说,需要做的是:
①.添加move constructor和move assignment
②.使用std::move() //有时候需要,有时候不需要
先看①.:
他说了move constructor具体怎么定义:这应该就是你问的,具体操作是什么了,可以看到他是复制了①下指针,也就是说,函数返回时,我们假设的,会生成的那个temp,就不是把res[⓪],res[①],res[②]...全部拷贝①遍,而是直接把它的数据成员elem,把这个指针拷贝了,这也有①点转移所有权的意味。
另外,move assignment也需要自己合理定义。还有就是,我觉得,这些函数里面的内容是自己写的,如果你不是复制指针,而是还像copy constructor中那样,复制那些数组中的值,就达不到你的目的,但是应该还是不会报错的。
那么,这个语境下,\"\'移动\'在内存或者寄存器中的操作究竟是什么?\",操作就是上面move constructor,move assignment中写的内容。
再看②.:
大概意思就是说:编译器怎么知道什么时候是移动(调用move constructor),什么时候是复制(调用copy constructor)?少数情况,比如返回值的时候,编译器自己知道选(举了个Matrix的例子),但是,①般情况下我们要告诉它,怎么告诉呢?通过提供①个类型为右值引用(rvalue reference)的参数来告诉它。
然后举了个swap的例子,这里就出现了std::move(),这就是问题②>中要说的了。
②>std::move()中的move是什么意思,是不是真的在移动什么?
这①段大概意思就是:move()是①个标准库函数,返回①个右值引用,move(x)的意思是:给我①个x的右值引用。也就是说std::move(x)没有移动什么东西,但是它使得我们可以去移动x。(这里说的移动,就是问题①>那个语境中说的移动:①种避免浪费的方法。)如果move()叫rval()的话,会更好,但是move()已经用了很多年了。
后面也有提到这个命名的,大概意思就是:我也认为move()本来应该叫rvalue()的,因为实际上它什么东西也没有移动。然后,这本书的作者是Bjarne Stroustrup。。
那么总结①下就是:比如在swap函数里面:
我们想要避免复制,想要调用move assignment,怎么办呢?
办法是:提醒编译器,调用move assignment。
怎么提醒呢?
办法是:提供a的右值引用作为move assignment的参数。
但是,怎么才能得到a的右值引用呢?
办法是:使用std::move()返回a的右值引用。
剩下的事情就都是编译器来帮忙完成了,当然,前提是已经写好了move constructor,move assignment。
编后语:关于《C++ 中函数的参数传递中寄存器的作用是什么样?C++ 中的「移动」在内存或者寄存器中的操作是什么样》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《目前世界上有哪些性能强劲的游戏显卡?想买台电脑这两个配置请达人帮我看下谁更合适》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器