C++ 中函数的参数传递中寄存器的作用是什么样?C++ 中的「移动」在内存或者寄存器中的操作是什么样

发表时间:2018-01-01 14:00:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《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++ 中的「移动」在内存或者寄存器中的操作是什么样》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《目前世界上有哪些性能强劲的游戏显卡?想买台电脑这两个配置请达人帮我看下谁更合适》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题