【问题标题】:Static memory allocation for array of objects in c++c++中对象数组的静态内存分配
【发布时间】:2018-01-04 06:32:08
【问题描述】:

注意: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){
}

可以用这个 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;
}

【问题讨论】:

  • 不是动态分配的,存储会提前预留。但它可能是动态初始化的。无论哪种方式,一切都会在它第一次使用之前发生。你确定要走“公共吸气剂的私人数据”路线吗?在我看来,您可以使用简单的聚合来完成。

标签: c++ arrays c++98


【解决方案1】:

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

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

【讨论】:

  • 关于constexpr,您只是忘了说类本身必须满足LiteralTypes 的条件,并且使用的所有表达式必须是常量(例如构造函数的常量参数)。在这种情况下,我也不确定复制省略,但我想即使他不在 C++17 中,编译器也会优化它。
  • 同时声明 arrconstexpr 将确保 constexpr 构造函数的要求。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2015-10-22
    • 2012-05-04
    • 2019-03-01
    • 2015-07-23
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多