仅在循环中为函数内部的变量分配一次内存

时间:2013-01-17 23:34:39

标签: c++ memory-management

让我们有一个为func分配内存的函数vec。也让我们在循环中多次调用func

void func ()
{
    std::vector<int> vec;
    vec.resize(someNumber);
}

for (int i=0; i<someNumber; ++i)
{
    func ();
}

如何在循环中仅为vec分配一次内存?

2 个答案:

答案 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);