const数组与函数中的静态const数组

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的说法,如果确实如此,究竟是什么?我该如何定义这种类型的数组,以确保它只被分配/初始化一次?

谢谢.

Dav*_*nan 5

编译器将为这两个选项生成相同的代码.

您的示例非常简单,因为该数组涉及普通旧数据(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次的构造函数.


Mar*_*k B 2

以最合乎逻辑、最清晰的方式声明和定义它,只有当分析显示它是瓶颈时,我才会建议更改代码。

在这种情况下,一些编译器很可能会生成相同的代码。由于初始化语义略有不同,其他人可能会生成不同的代码(例如,在某些情况下,g++ 使用互斥锁保护静态变量的初始化)。

事实上,确定您的特定编译器的唯一方法是查看反汇编。