我在很多地方都有这样的代码:
some_function_signature()
{
T a;
T b = f1(a);
T c = f2(b);
T d = f3(c);
...
}
如您所见,在这样的函数中,a
传递给f1()
以产生b
,然后b
传递给f2()
以产生{ {1}},依此类推。在函数调用(c
...之后,将不使用这些变量。而且它们拥有大容量存储空间(例如f1,f2,f3
是大图像数据)。 这里的问题是,在此函数内,累积的内存消耗可能很大,我想减少这一点。等待T的析构函数释放内存,将使T
的峰值内存使用量非常大。
我可以在使用后执行以下操作以释放内存:
some_function_signature()
我想知道是否可以使此过程自动化且更加优雅。例如,范围内存管理过程或使用某种类型的引用计数,但是我只是不知道如何在此处最好地应用这些方法。
答案 0 :(得分:6)
这看起来像是移动语义的情况。确保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));
...
}
这将允许T f1(T&& t)
回收移入的图像。
答案 1 :(得分:0)
您可以尝试以下操作:
T d;
{
T c;
{
T b;
{
T a;
b = f1(a);
} //a goes out of scope and is destroyed here
c = f1(b);
} //b goes out of scope and is destroyed here
d = f3(c);
}//c goes out of scope and is destroyed here