2

这是好习惯吗?或者我应该只用函数替换代码块{}?它可能是可重用的(我承认),但我这样做的唯一动机是解除分配colsum,因为它很大而且不需要,因此我可以释放分配的内存。

 vector<double> C;
 {
  vector<double> colsum;
  A.col_sum(colsum);
  C = At*colsum;
 }
 doSomething(C);
4

5 回答 5

13

在我的书中使用括号来定义自动变量的范围很好,但通常如果你发现自己做了很多,尤其是在同一个函数中多次,你的函数可能做了太多不同的事情,应该分解。

于 2010-07-14T17:23:01.520 回答
5

向量的数据总是动态分配的。只有簿记数据存储在堆栈中。即使不是,堆栈内存分配也基本上是免费的。在大多数架构上,从堆栈中释放只是更改寄存器的值。

编辑

关于动态释放,它必须在某一点或另一个(特别是函数的末尾)释放。在您想要分配更多并且没有足够的内存之前,您实际上并没有因为分配内存而失去任何东西。在您真正遇到问题之前,是否真的需要关注解除分配的确切时间?

/编辑

但有什么意义呢?看起来您似乎过早地关注自己的优化。

如果你想重构你的代码,这样做是为了清晰,而不是为了性能。

于 2010-07-14T17:23:47.770 回答
3

Vector 不在堆栈上存储内存。只有矢量对象本身存储在那里,不是很大。像这样确定它的范围确实会强制进行破坏,这将释放它分配的内存。

另外,我不确定 ISO 中是否指定实现必须从堆栈中弹出一个子范围变量。

于 2010-07-14T17:29:11.330 回答
3

正如其他人指出的那样,向量内存未在堆栈中分配。如果您想尽早释放该内存,则常用的成语是:

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()不需要释放可用内存,并且在许多情况下,他们不会假设如果向量之前增长到那个大小,它很可能会再次这样做。

于 2010-07-14T17:36:02.313 回答
0

如果内部代码将在其他地方重用,请将其分离为一个函数。如果频繁调用内部代码(例如在循环中),则可能需要对其进行重构,以便向量不会在循环中不断创建和销毁。否则,我认为按照您的建议去做并不是不好的做法。

于 2010-07-14T22:54:15.280 回答