C ++中对象数组的静态内存分配

Static memory allocation for array of objects in c++

注意:C++98 是唯一可用的标准

我正在尝试创建一个大数组以在 运行 期间用作查找 table,但我在编译时知道所有 table 信息。从概念上讲,我知道我可以通过静态分配节省很多 运行 时间,但我在使用 C++ 语法时遇到了一些麻烦。

或者,简单地说,我正在寻找执行 class 版本

的正确方法
const int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

通过在编译时知道我想存储在对象数组中的所有内容来尽可能多地节省开支。

这是我的 class 条目示例

class foo{
  private:
    const int a;
    const char * b;
  public:
    foo(const int a, const char * b);
    int get_a(void) const{
      return this->a;
    }
    const char * get_b(void) const{
      return this->b;
    }
};

foo::foo(
         const int a,
         const char * b
       ) :
          a(a),
          b(b){
}

可以运行用这个main

//Is this array statically allocated at compile time or dynamically allocated at run time with the constructors of foo?
foo arr[2]={
  foo(0,"b0"),
  foo(1,"b1")
};

int main(void){
  for(int i=0;i<2;i++){
    std::cout<<arr[i].get_a()<<std::endl;
    std::cout<<arr[i].get_b()<<std::endl;
  }
  return 0;
}

数组 arr 是在编译时静态分配的,但它是在编译时初始化还是在 运行 时初始化可能因编译器而异。安全的赌注是你的编译器在 运行 时初始化数组,但如果构造函数足够简单,有些编译器可以使用编译时初始化而不是 运行 时初始化。

在 C++11 及更高版本中,您可以将 foo 的构造函数声明为 constexpr,以使编译器在编译时初始化 arr

无法确定初始化发生的时间。要用你的编译器检查它,你可以在构造函数中设置一个断点,然后 运行 它处于发布模式。