将大向量声明为成员变量或成员函数内的局部变量更好吗?

Is it better to declare a large vector as a member variable or a local variable inside a member function?

假设我们需要处理一个大向量,它只在成员函数内部局部使用。我们将其声明为成员函数以节省重新分配时间是否有任何优势?因为每次创建和销毁 10000 个整数?假设这是任务关键型嵌入式系统中的 运行。并且该函数被重复调用!

class Foo {
  Foo() {
  
  }
  size_t update(int val) {
     vector<int> v(10000);
     for (int i = 0; i < 10000; ++i) {
        v[i] = i*i + val;
     }
     return compute(v);
  } 
  
};
class Foo {
  Foo() {
    v.resize(10000);
  }
  size_t update(int val) {
     for (int i = 0; i < 10000; ++i) {
        v[i] = i*i + val;
     } 
     return compute(v);
  } 
  private:
  vector<int> v; 
  
};

是的,将其声明为成员变量可能会提高性能,但也可能微不足道。一如既往:衡量,不要假设。

构造和销毁 int 不是问题(这是一个空操作),但内存分配和释放将会发生变化。
这将取决于系统使用的分配器,并且由于您提到的嵌入式系统可能有很多不同的东西。

然而,将其声明为成员变量存在一个挑战:你能保证没有对向量的并行访问吗?
如果没有,您将需要添加互斥锁等来保护访问,这在性能方面可能比分配更差。

实时系统中经常使用的一种模式是预先分配所有内存,以确保在运行时时序是恒定的。
在这种情况下,我会考虑将向量声明为 class 之外的静态变量(即不在头文件中),这意味着它将在 main() 之前构造并且不会有运行时意外。
但是,仅当 class 仅实例化一次时才应执行此操作,否则您可以保证不会发生矢量的并行使用。