1

我已经实现了一个使用查找表的快速比较功能。由于项目中多个类都用到了这个函数,所以我需要确保在整个程序执行过程中,查找表只有一份。

查找表是一个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;
}
4

2 回答 2

6

我希望这个表在程序开始时被初始化,而不是在它第一次使用的时候。

为什么不在 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;
}

Herb Sutter在这里解释了 lambda 初始化

于 2013-04-15T22:36:18.253 回答
2

你描述的是单例模式。Web 上有关于如何使用 C++ 通常实现单例的文档。

基本上它是一个带有静态函数的小类,它返回指向查找表的指针/引用(我个人,我更喜欢引用)。

参考:Singleton:应该如何使用

但是,针对您的特定问题的一个更简单的解决方案可能是只生成一次查找表,然后转手boost::shared_pointer

于 2013-04-14T22:10:33.677 回答