这是好习惯吗?或者我应该用函数替换{
和}
之间的代码块?它可以重复使用(我承认),但我这样做的唯一动机是释放colsum
,因为它是巨大的而不是必需的,这样我就可以释放分配的内存。
vector<double> C;
{
vector<double> colsum;
A.col_sum(colsum);
C = At*colsum;
}
doSomething(C);
答案 0 :(得分:13)
在我的书中使用括号来区分自动变量很好,但一般来说,如果你发现自己做了很多,特别是在同一个函数中多次,你的函数可能做了太多不同的事情,应该分解。 / p>
答案 1 :(得分:5)
向量的数据始终是动态分配的。只有簿记数据存储在堆栈中。即使不是,堆栈内存分配基本上是免费的。从堆栈中取消分配只是在大多数架构上更改寄存器的值。
修改强>
关于动态释放,必须在某一点或另一点(特别是函数的结尾)取消分配。你实际上没有丢失任何东西,只需要分配内存,直到你想分配更多而且还不够。在实际遇到某些问题之前,解除分配的确切时间是否真的需要关注?
<强> /修改
但重点是什么?看起来你似乎过早地关注自己的优化。
如果您想重构代码,请为了清晰起见而不是表现。
答案 2 :(得分:3)
Vector不会在堆栈中存储内存。只有矢量对象本身存储在那里,这不是很大。像这样确定它会强制破坏,这将释放它已分配的内存。
另外,我不确定ISO中是否指定实现必须从堆栈中弹出子范围变量。
答案 3 :(得分: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()
不需要释放可用内存,并且在许多情况下,他们不会假设如果向量增长到那个大小之前,很可能它会再做一次。
答案 4 :(得分:0)
如果内部代码将在其他地方重用,请将其分成一个函数。如果频繁调用内部代码(如在循环中),则可能需要重构内容,以便不在循环中不断创建和销毁向量。否则,我不认为做你建议的做法是不好的做法。