在C++中使用全局向量

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)

ind*_*ced 5

我希望这个表在程序开始时初始化,而不是在第一次使用时初始化.

为什么不在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初始化