c++ - 如何初始化静态本地 POD 常量?懒还是不懒?

标签 c++

POD 表示没有构造函数和析构函数的原始数据类型。

我很好奇,编译器如何处理 POD 静态局部变量的惰性初始化。如果函数要在多线程应用程序中的紧密循环内运行,那么惰性初始化意味着什么?这些是可能的选择。哪个更好?

void foo_1() {
    static const int v[4] = {1, 2, 3, 4};
}

void foo_2() {
    const int v[4] = {1, 2, 3, 4};
}

这个怎么样?没有惰性初始化,但语法略显笨拙?

struct Bar
{
    static const int v[4];

    void foo_3()
    {
        // do something
    }
};

const int My::v[4] =  {1, 2, 3, 4};

最佳答案

当用常量数据初始化静态变量时,我熟悉的所有编译器都会在编译时初始化值,因此没有任何运行时开销。

如果变量不是静态的,则必须在每次函数调用时分配它,并且必须将值复制到其中。我想如果它是一个 const 变量,编译器可能会将其优化为 static,但 const-ness 可以被丢弃。

关于c++ - 如何初始化静态本地 POD 常量?懒还是不懒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4513350/

相关文章:

c++ - Qt 对象/类到 Qt ui 文件

c++ - 从重心到笛卡尔

c++ - 使用动态数组的操作内存中的垃圾

c++ - 为什么赋值运算符同时调用复制构造函数和赋值运算符?

c++ - 多线程全局对象访问

c++ - 不允许向 vector 中添加更多元素

c++ - 使用 std::string 隐式构造 NSString

c++ - 使用 Arduino 和 C++ 进行字符串操作

c++ - 在 C++ 中读取/写入文件的多线程?

c++ - 使用 Windows API 处理 Unicode 字符串