enz*_*m83 1 c++ variables static scope global-variables
我已经实现了一个使用查找表的快速比较功能.由于此函数在项目的多个类中使用,我需要确保在整个程序执行期间只有一个查找表副本.
查找表是一个简单vector<int>的大小65536.我希望这个表在程序开始时初始化,而不是在它第一次使用时.如何处理这个问题?
以下代码段是我的比较函数的当前版本.我相信通过创建lookup_table一个静态变量,问题将只能部分解决,因为静态变量的生命周期是在程序流第一次遇到声明时开始的.
int fast_compare(const char* array1, const char* array2, int length)
{
static const vector<int> lookup_table = init_lookup_table();
// process the input arrays...
// ...
return lookup_table[...];
}
vector<int> init_lookup_table()
{
vector<int> lut(65536);
// ----------------------------
// initialize the look-up table
// ...
// ...
// end of initialization
// ----------------------------
return lut;
}
Run Code Online (Sandbox Code Playgroud)
我希望这个表在程序开始时初始化,而不是在第一次使用时初始化.
为什么不在cpp文件中使用未命名的命名空间?
#include <numeric>
#include <iterator>
#include <iostream>
#include <vector>
namespace {
//c++11 version
static auto const lookup_table = []() -> std::vector<int> {
std::vector<int> lut(65536);
iota(begin(lut), end(lut), 0);// init lut here
return lut;
}();// invoke the lambda
//c++ 98 version
//static const std::vector<int> lookup_table = init_lookup_table();
}
int main()
{
std::cout<<"lut[32768] = " << lookup_table[32768]<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Herb Sutter 在这里解释了lambda初始化