jam*_*mes 1 c++ memory-management c++11
有很多地方我得到这样的代码:
some_function_signature()
{
T a;
T b = f1(a);
T c = f2(b);
T d = f3(c);
...
}
Run Code Online (Sandbox Code Playgroud)
如您所见,在这样的函数中,a
传递f1()
给生成b
,然后b
传递f2()
给生成c
,等等.函数调用(f1,f2,f3
...)后不会使用这些变量.并且它们拥有大容量存储器(例如,T
是大图像数据).这里的问题是在这个函数中,累积的内存消耗可能很大,我想减少它.等待T的析构函数释放内存将使峰值内存使用量some_function_signature()
非常大.
我可以做这样的事情来使用后释放内存:
some_function_signature()
{
T a;
T b = f1(a); a.free();
T c = f2(b); b.free();
T d = f3(c); c.free();
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以使这个过程自动且更优雅.例如,作用域内存管理过程或使用类型的引用计数,但我只是不知道如何最好地应用这些方法.
这看起来像移动语义的情况.确保T
并f1/2/3
支持移动语义,并将示例更改为
some_function_signature()
{
T a;
T b = f1(std::move(a));
T c = f2(std::move(b));
T d = f3(std::move(c));
...
}
Run Code Online (Sandbox Code Playgroud)
这将允许T f1(T&& t)
回收移入的图像.