有一个函数,需要返回一个比较大的对象。为了避免堆栈溢出,打算在函数中,在堆上产生这个对象,用智能指针shared_ptr指向对象。然后在函数返回的时候,返回这个对象的引用,而不是返回这个对象本身。这样就可以避免占用大量堆栈内存了。在外层函数中,对这个对象取值,然后就抛弃了。
之所以不返回指向对象的智能指针,是因为外层函数中,要取得对象本身,还要对指针解引。这样,外面使用这个对象的表达式看起来不好理解。
我网上搜索过,一般函数返回引用的情况,大都是对象在函数外生成,并作为引用输入参数传递给函数。没发现把函数内,堆上产生对象的引用直接返回的情况。虽然我觉得这种情况应该也是合理的。
我有几个问题:这么做是否合理?有没有更好的办法?还有,堆上分配的内存会不会在外层函数退出时自动释放?
请不吝赐教。先谢谢。
返回的时候,move出来
return std::move(pointer);
研究了一下,这里直接 return pointer;貌似也是可以的,实际执行时,因为unique_ptr不能copy,所以编译器按规则,调用了move;当然不如自己直接move语义更清晰。
我感觉这里面用shared_ptr应该也是可以的,问题是可能造成了不必要的开销。unique_ptr显然更合适。
现在的结果是,进入求伪逆函数本身不直接堆栈溢出了。当计算到最后,调用矩阵乘法运算符 *= 的时候,又堆栈溢出了。还得研究一下,怎么样进一步节省堆栈空间。我把临时变量都尽量在堆上生成了。还有什么办法涅?
前一步已经把求伪逆函数内部需要求转置,方阵求逆计算等函数改成在堆上生成计算结果。
现在再把那个主要的占据堆栈空间的,好几个矩阵相乘的大公式分成几个步骤相乘。每一步不在直接用 * 来计算矩阵相乘。而是先在堆上生成结果矩阵,然后把他传给Mutiply函数做参数。这样就避免了多个矩阵相乘,要生成很多临时矩阵,占用堆栈空间的问题。
最后终于把问题解决了。现在Windows下使用缺省1M堆栈空间,不再报告堆栈溢出错误了。
感谢各位大侠拔刀相助,感觉跟大家讨论之后,很多概念清晰多了。谢谢!我得再把C++入门捋一遍,争取早点入门。LOL
Have a good week end!
{
std::shared_ptr<BIG_MATRIX>