Я реализовал функцию быстрого сравнения, которая использует справочную таблицу. Поскольку эта функция используется в нескольких классах проекта, мне нужно убедиться, что во время всего выполнения программы есть только одна копия справочной таблицы.Использование глобального вектора в C++
Таблица поиска - это простой 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;
}
Если вы знаете размер во время компиляции, вы можете извлечь выгоду из использования 'станд :: array' вместо' станд :: VECTOR'. –
Объявление 'lut' как переменной' static' в функции 'fast_compare' сделает его более потокобезопасным. Вы можете перенести переменную с вызовом функции при запуске, если вам требуется предсказуемое время выполнения. –
Мой комментарий к thread-safty относится только к C++ 11, см. Пункт 6.7.4. –