这是好习惯吗?或者我应该只用函数替换代码块{
吗}
?它可能是可重用的(我承认),但我这样做的唯一动机是解除分配colsum
,因为它很大而且不需要,因此我可以释放分配的内存。
vector<double> C;
{
vector<double> colsum;
A.col_sum(colsum);
C = At*colsum;
}
doSomething(C);
在我的书中使用括号来定义自动变量的范围很好,但通常如果你发现自己做了很多,尤其是在同一个函数中多次,你的函数可能做了太多不同的事情,应该分解。
向量的数据总是动态分配的。只有簿记数据存储在堆栈中。即使不是,堆栈内存分配也基本上是免费的。在大多数架构上,从堆栈中释放只是更改寄存器的值。
编辑
关于动态释放,它必须在某一点或另一个(特别是函数的末尾)释放。在您想要分配更多并且没有足够的内存之前,您实际上并没有因为分配内存而失去任何东西。在您真正遇到问题之前,是否真的需要关注解除分配的确切时间?
/编辑
但有什么意义呢?看起来您似乎过早地关注自己的优化。
如果你想重构你的代码,这样做是为了清晰,而不是为了性能。
Vector 不在堆栈上存储内存。只有矢量对象本身存储在那里,不是很大。像这样确定它的范围确实会强制进行破坏,这将释放它分配的内存。
另外,我不确定 ISO 中是否指定实现必须从堆栈中弹出一个子范围变量。
正如其他人指出的那样,向量内存未在堆栈中分配。如果您想尽早释放该内存,则常用的成语是:
vector<double> C;
vector<double> colsum;
A.col_sum(colsum);
C = At*colsum;
std::vector<double>().swap(colsum);
doSomething(C);
这将创建一个临时向量并将内容与您的大向量交换。在指令结束时,临时对象将被销毁并释放内存。您将留下一个空向量。
请注意,colsum.resize(0)
并且colsum.clear()
不需要释放可用内存,并且在许多情况下,他们不会假设如果向量之前增长到那个大小,它很可能会再次这样做。
如果内部代码将在其他地方重用,请将其分离为一个函数。如果频繁调用内部代码(例如在循环中),则可能需要对其进行重构,以便向量不会在循环中不断创建和销毁。否则,我认为按照您的建议去做并不是不好的做法。