让我们有一个func
为vec
. 同样 let'sfunc
在一个循环中被多次调用。
void func ()
{
std::vector<int> vec;
vec.resize(someNumber);
}
for (int i=0; i<someNumber; ++i)
{
func ();
}
如何vec
在循环中只分配一次内存?
让我们有一个func
为vec
. 同样 let'sfunc
在一个循环中被多次调用。
void func ()
{
std::vector<int> vec;
vec.resize(someNumber);
}
for (int i=0; i<someNumber; ++i)
{
func ();
}
如何vec
在循环中只分配一次内存?
我可以看到两种可能的解决方案。一种是让函数引用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 之类的东西。我并不是说您不应该尝试预测可能的瓶颈并围绕它们进行工程设计,但不要过分担心每个可能的函数调用和分配/释放。
如果这是一个工作应用程序而不是原型,请运行分析器。您很可能会发现任何瓶颈都存在于其他地方。
正如 Beta 所说,每次func()
调用函数时都会创建一个新向量,并在函数退出时销毁。如果你想有一个单独的向量,每次调用都会调整大小,你可能想做类似的事情
std::vector<int> vec;
for (int i=0; i<someNumber; ++i)
{
vec.resize(i);
}
或者您可以使用您需要的最大内存直接初始化您的向量
std::vector<int> vec(someNumber);