//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
在第一次使用之前被正确初始化,而不需要额外的初始化代码。