
Сообщение от
homo ludens
Любая функция, убивающая поток выполнения и ничего не знающая про С++.
pthread_cancel например, или longjump, которым пугают первокурсников.

Я не использую либы которые без моего указания манипулируют потоками.
С longjump аналогично.
Разница в том, что многие кодогенераторы обычно ООП и шаблоны и многие фишки С++ не поддерживают.
И держаться в рамках чистого С++ с "правильным" кодом не удается все равно - ну не поддерживает эта штука например исключений, значит надо код возврата использовать. И получается, что в программе сосуществуют два разных стиля.
Использование генераторов это один из методов инкапсуляции. АПИ - это синтаксис на входе, а генерируемый код - это реализация.
Так что с ООП тут все в порядке.
К тому же ООП никакого отношения к стилю или языку не имеет. Это надъязыковая техника.
ни в коем случае нельзя здесь использовать flex!
Решение будет хуже.
Flex не дает О(1), он заточен больше на использование регексов.
Регексы это синтаксис. А реализуются они обычно конечными автоматами, которые широко оптимизируются (теми же генераторами) для разных частных случаев.
Если в регексе только инварианты фиксированной длины (а словарь ключевых слов именно такой: /(a|b|c|...)/) то получается DFA, чья производительность не зависит от кол-ва инвариантов в регексе, а зависит только от длины слов подаваемых на вход для парсинга (так же как и идеальная хеш-ф-я). Таким образом сложность алгоритма O(1).
Не, нельзя.
Условие - очень быстрый, это раз.
Поэтому все выделения памяти должны быть сделаны один раз.
Второе, почему копирование строки, а не увеличение счетчика ссылок.
Такой кэш имеет фиксированную верхнюю границу используемой памяти и фиксированную верхнюю границу скорости работы.
Я этот код часто использовал в GP системах, где функция вычисляется при случайных значениях много раз во внутреннем цикле.
Так что никаких malloc и vector, будет хуже.
Код:
//! yes, this is cache size, really :-)
#define CACHESIZE 0x100000UL
//! very long function..... maxlen has same semantics as 'n' in str'n'cpy/str'n'cmp
double tormozzzz(const char*,int maxlen);
//! some fast hash function (i.e. Bernstein hash). maxlen as above
uint32_t hash(const char*,int maxlen);
//! cache
struct cacheItem
{
char arg[MAXSIZE];
double val;
};
vector<cacheItem> cache(0);
double getFunctionVal(const char* s)
{
if (cache.size() == 0)
cache.resize(CACHESIZE);
cacheItem& p = cache[hash(s, MAXSIZE) % CACHESIZE];
// first predicate work in case of test uninitialized cache cell
if(p.arg[0] != '\0' && strncmp(p.arg, s, MAXSIZE) == 0)
return p.val;
strncpy(p.arg, s, MAXLEN);
return (p.val = tormozzzz(s, MAXSIZE));
}
Покажите, в каком месте этот код медленее исходного варианта.
Надеюсь вы не имеете ввиду два дополнительных if c проверкой размера массива (второй внутри operator[])?
Покажите, где в этом коде перераспределяется память в процессе работы.
Поэтому кстати анализируется, кэшируется и хранится только часть строки.
Если хранится только часть строки то алгоритм будет иметь ложные срабатывания при ключах больших длины обрезания, хоть и с небольшой но ощутимой вероятностью. Могу подробнее расписать если требуется.
Социальные закладки