-2

让我们有一个funcvec. 同样 let'sfunc在一个循环中被多次调用。

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

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

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

4

2 回答 2

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 之类的东西。我并不是说您不应该尝试预测可能的瓶颈并围绕它们进行工程设计,但不要过分担心每个可能的函数调用和分配/释放。

如果这是一个工作应用程序而不是原型,请运行分析器。您很可能会发现任何瓶颈都存在于其他地方。

于 2013-01-17T23:45:49.963 回答
0

正如 Beta 所说,每次func()调用函数时都会创建一个新向量,并在函数退出时销毁。如果你想有一个单独的向量,每次调用都会调整大小,你可能想做类似的事情

std::vector<int> vec;
for (int i=0; i<someNumber; ++i)
{
    vec.resize(i);
}

或者您可以使用您需要的最大内存直接初始化您的向量

std::vector<int> vec(someNumber);
于 2013-01-17T23:48:17.180 回答