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

问题描述 投票:1回答:2

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

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

或者,简单地说,我正在寻找正确的方法来做一个类的版本

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

通过在编译时知道我想要存储在对象数组中的所有内容,尽可能节省成本。

这是我的课程类的一个例子

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){
}

可以用这个主要运行

//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;
}
c++ arrays c++98
2个回答
2
投票

数组arr在编译时静态分配,但无论是在编译时还是在运行时初始化,编译器之间都可能不同。可以肯定的是,您的编译器在运行时初始化数组,但是如果构造函数足够简单,那么编译器可以使用编译时初始化而不是运行时初始化。

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


0
投票

没有办法确定何时初始化发生。要使用编译器进行检查,可以在构造函数中设置断点并在发布模式下运行它。

© www.soinside.com 2019 - 2024. All rights reserved.