C/C++ 函数参数和返回值传递机制

c++函数的返回值存在哪?反汇编代码分析

上面两篇文章讲的比较全面,我来说说我想到的。

这几天看了好多协程的东西,再看完上面的文章不得不感慨一下,怪不得高德纳说子例程是协程的特例,切换时的操作相似(这是题外话了)。

之所以会研究C/C++的参数和返回值传递机制是因为碰到C++中的右引用,一直想了解右引用的原理,以及比较底层的操作,右引用的作用是减少对象构造的次数,到底是怎么减少的呢?

在上面的文章中我们可知传统意义的返回值是在函数调用堆栈中的。

在C++11出现右值引用之前 int v = func();这样的语句。操作流程为func函数里先将返回值放到函数调用堆栈中,再将返回值赋予本地变量v中。中间拷贝了两次。这里的值是int所以还好,如果是一个对象呢,占有许多字节的对象,消耗会更多,而且C++中对象的构建方法与析构方法的反复调用,无一不加重了消耗。

深入理解C++右值引用

这篇文章我们着重看清单2的汇编源码。

由此我们可以推断出右值引用由两部分组成,头部是指针区域,指向值区域,第二部分,就是值区域,两部分是连续的内存区域。

这里我们就可以推测了,拥有右值引用返回值的函数,并不是将要返回的值放到函数调用堆栈中,而是放在了右值引用的值区域中,且右值引用还有移动语义,调用相应构造方法可以完成一些其他操作。

在解决右值引用的返回机制的疑惑过程中,深受C的函数机制的影响。殊不知C++很早就是与C拥有巨大不同的语言了。C++可以拥有自己的方法机制,右值引用的机制很好的解决了函数返回值性能消耗的问题。