让我们有一个为func
分配内存的函数vec
。也让我们在循环中多次调用func
。
void func ()
{
std::vector<int> vec;
vec.resize(someNumber);
}
for (int i=0; i<someNumber; ++i)
{
func ();
}
如何在循环中仅为vec
分配一次内存?
答案 0 :(得分:1)
我可以看到两种可能的解决方案。一个是让函数引用它可以使用的std::vector<int>
。
void func (std::vector<int> & vec)
{
vec.resize(someNumber);
}
另一种可能性是创建一个使用私有向量的仿函数,因此可以重复使用该分配,假设它被多次调用。
class SomeFunctor
{
public:
void operator()();
private:
std::vector<int> vec;
}
void SomeFunctor::operator()()
{
vec.resize(someNumber);
}
可以这样使用:
SomeFunctor func;
for (int i=0; i<someNumber; ++i)
{
func ();
}
请注意,在向量上调用resize()
意味着向量将为现有元素分配新存储,复制现有元素,并取消分配旧存储。这违背了保持向量对象的整个目的,因为向量的内部分配永远不会被重用!请考虑使用reserve()
,而不会缩小(但可能会扩大)分配。
最佳解决方案可能不是这些方法,而是更简单的方法。您的示例代码没有给出足够的细节来了解这些方法是否有益。
作为旁注,请记住,过早优化是一件坏事。首先编码,然后运行一个分析器,看看瓶颈在哪里 - 通常它们将围绕收集用户输入或其他东西,如网络和磁盘I / O.我并不是说你不应该试图预测可能存在的瓶颈并围绕它们进行设计,但不要过分担心每个可能的函数调用和分配/释放。
如果这是一个有效的应用程序而不是原型,请运行一个分析器。您很可能会发现任何瓶颈都在其他地方。
答案 1 :(得分:0)
正如Beta所说,每次调用函数func()
时,都会创建一个新向量,并在函数退出时销毁。如果你想让每个调用都调整一个向量,你可能想做类似的事情
std::vector<int> vec;
for (int i=0; i<someNumber; ++i)
{
vec.resize(i);
}
或者您可以使用
所需的最大内存来直接初始化矢量std::vector<int> vec(someNumber);