注意: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;
}
数组arr
在编译时静态分配,但无论是在编译时还是在运行时初始化,编译器之间都可能不同。可以肯定的是,您的编译器在运行时初始化数组,但是如果构造函数足够简单,那么编译器可以使用编译时初始化而不是运行时初始化。
在C ++ 11及更高版本中,您可以将foo
的构造函数声明为constexpr
,以使编译器在编译时初始化arr
。
没有办法确定何时初始化发生。要使用编译器进行检查,可以在构造函数中设置断点并在发布模式下运行它。