C++ 在成员函数中,将大向量声明为成员变量还是局部变量更好?

C++ 在成员函数中,将大向量声明为成员变量还是局部变量更好?,c++,embedded,stdvector,class-design,C++,Embedded,Stdvector,Class Design,假设我们需要处理一个大向量,它只在成员函数中局部使用。我们将它声明为成员函数以节省重新分配时间有什么优势吗?因为每次都有10000个整数被创建和销毁?假设它在任务关键型嵌入式系统中运行。并且该函数正在被反复调用 class Foo { Foo() { } size_t update(int val) { vector<int> v(10000); for (int i = 0; i < 10000; ++i) { v[i]

假设我们需要处理一个大向量,它只在成员函数中局部使用。我们将它声明为成员函数以节省重新分配时间有什么优势吗?因为每次都有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(){
}
大小更新(int val){
向量v(10000);
对于(int i=0;i<10000;++i){
v[i]=i*i+val;
}
返回计算(v);
} 
};
class-Foo{
Foo(){
v、 调整大小(10000);
}
大小更新(int val){
对于(int i=0;i<10000;++i){
v[i]=i*i+val;
} 
返回计算(v);
} 
私人:
向量v;
};

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

构造和销毁ints不是问题(这是一个不可操作的问题),但内存分配和释放将是改变的内容。
这将取决于系统使用的分配器,因为您提到的嵌入式系统可能有很多不同的东西

然而,通过将其声明为成员变量存在一个挑战:您能保证不对向量进行并行访问吗?
如果没有,您将需要添加互斥体等来保护访问,这可能比分配更糟糕

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

向量有什么好处?在你的例子中,没有什么,你应该把它完全更新到一个更有用的例子,考虑这是一个嵌入式系统和固定大小数组的极小的例子,考虑<代码> STD::数组< /代码>。我同意@ MalSter。如果此代码在没有虚拟内存控制器(即基本微控制器)的任务关键型嵌入式系统上运行,则我不会将其留给堆,以便在每次运行时进行分配和取消分配。您永远无法预测内存分配失败的时间(例如,由于某些其他模块同时分配大量内存,或碎片)。我将创建一个
std::array
作为类成员。谢谢。这是一个极好的答案。关于预分配,如果您想在多个位置执行此操作,自定义分配器是否可以用于此目的?@ram我不认为自定义分配器会有帮助-即使您制作了一个适合用例的分配器(我不认为这是一种明确的方法),它只会掩盖问题,使您更难看到真正发生的事情。我建议简单地使用这种模式,不要在函数中创建这样的复杂对象,而是确保在实际工作开始之前创建它们。
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; 
  
};