【C++11新特性】在定义静态成员变量的同时进行初始化

//test.h
class test
{
public:
    test() = delete;
    ~test() = delete;
private:
    static constexpr long long POLY_64_REV = 0x95AC9329AC4BC9B5L;
    static constexpr int BITS_PER_BYTE = 8;
    static constexpr int CRC_TABLE_LENGTH = 256;
    static long long sCrcTable[CRC_TABLE_LENGTH];
    static bool sIsInitialized;
};

//test.cpp
long long test::sCrcTable[CRC_TABLE_LENGTH] = { 0 };

bool test::sIsInitialized = []() {
    long long part;
    for (int index = 0; index < CRC_TABLE_LENGTH; index++) {
        part = index;
        for (int bit = 0; bit < BITS_PER_BYTE; bit++) {
            long long value = ((int)part & 1) != 0 ? POLY_64_REV : 0;
            part = (part >> 1) ^ value;
        }
        sCrcTable[index] = part;
    }
    return true;
    }();

这段代码是在初始化静态成员变量 sIsInitialized,它是一个 bool 类型的变量。这种写法利用了C++11中的新特性,即在定义静态成员变量的同时进行初始化,这样可以确保 sCrcTable 和 sIsInitialized 在程序开始运行时被正确初始化。

具体来说,代码的作用是初始化一个名为 sCrcTable 的长整型数组,数组的长度为 CRC_TABLE_LENGTH,即256。这个数组存储了预先计算好的循环冗余校验(CRC)的值。在初始化过程中,通过一个循环来计算每个 index 对应的 CRC 值,然后存储在 sCrcTable[index] 中。

关键的部分是 sIsInitialized 的赋值部分 { ... }();,这是一个立即执行的匿名函数(或者称为立即执行的lambda表达式)。这种技术可以确保 sCrcTable 在第一次使用之前被正确初始化,而不需要额外的初始化代码。

posted @ 2024-07-12 16:02  素装写淡定  阅读(52)  评论(0)    收藏  举报