fog*_*bit 10 c++ arrays static const
例如,有一个功能做某事.我应该如何在函数内声明和定义一个数组,我只想分配/初始化一次?
void someclass::somefunction(/*parameters here*/)
{
static const my_array[4] = {1,2,3,4}; // #1
/*or just*/
const my_array[4] = {1,2,3,4}; // #2
}
Run Code Online (Sandbox Code Playgroud)
据我所知,#1"my_array"将在数据段中分配,并在第一次"somefunction"调用时初始化一次.但是我的一位同事假设案例#2以相同的方式工作,并且不需要编写"静态"关键字.
所以我想问一下,标准是关于案例#1和#2的说法,如果确实如此,究竟是什么?我该如何定义这种类型的数组,以确保它只被分配/初始化一次?
谢谢.
编译器将为这两个选项生成相同的代码.
您的示例非常简单,因为该数组涉及普通旧数据(POD).标准说每次somefunction运行时都会初始化选项1 ,但是第一次somefunction运行时将初始化选项2 .但是,只要结果与标准中指定的结果(即所谓的as-if规则)无法区分,就允许实现偏离.
在这种情况下,编译器将数组写入可执行文件的只读内存,并且在运行时根本没有初始化.他们可以使用POD类型执行此操作.
如果你有一个需要运行时实例化的对象,那么事情会有所不同.考虑以下程序的行为:
class MyObject
{
public:
MyObject() {}
};
void f()
{
const MyObject arr1[1] = { MyObject() };
static const MyObject arr2[1] = { MyObject() };
}
int main(int argc, char* argv[])
{
f();
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
MyObject运行3次的构造函数.
以最合乎逻辑、最清晰的方式声明和定义它,只有当分析显示它是瓶颈时,我才会建议更改代码。
在这种情况下,一些编译器很可能会生成相同的代码。由于初始化语义略有不同,其他人可能会生成不同的代码(例如,在某些情况下,g++ 使用互斥锁保护静态变量的初始化)。
事实上,确定您的特定编译器的唯一方法是查看反汇编。