Как оптимизировать поиск жестко закодированных символов? - PullRequest
0 голосов
/ 07 мая 2019

Я делаю приложение на C ++, которое реализует класс Symbol (аналогично Atom в XLib или :symbols в ruby), который по существу отображает строку в целочисленное значение уникальное для строки из поискаtable.

Это означает, что инициализация a Symbol является единственной частью использования, которая занимает значительное время, просматривая таблицу подстановки каждый раз, когда она создается.

Обычно это просто необходимое зло, но при этом становится больно:

void someRepeatedlyCalledFunction () {
    doThingWithSymbol(Symbol("HardCodedSymbolString"));
}

Это означает, что каждый раз, когда я вызываю эту функцию, поиск всего символа происходит снова.

Конечно, этого можно избежать с помощью:

Symbol _HardCodedSymbolString;

void someRepeatedlyCalledFunction () {
    if (!_HardCodedSymbolString.isSet())
        _HardCodedSymbolString = Symbol("HardCodedSymbolString");

    doThingWithSymbol(_HardCodedSymbolString);
}

Но это непривлекательная вещь, которую приходится часто делать, поэтому в идеале ее можно спрятать за макросом - _SYMBOL(name) или чем-то в этом роде.Проблема в том, что, поскольку этот макрос вызывается из в функции, нет способа определить глобальную переменную для этого символа.

В качестве альтернативы, он был бы даже лучше , если жестко закодированные значения символов были добавлены в список в время компиляции , поэтому правильные значения символов вставляются как константы - но я не вижу способа сделать это без написания какого-либопользовательский шаг препроцессора.

Есть ли способ реализовать эти решения или, возможно, лучшее решение?

1 Ответ

0 голосов
/ 07 мая 2019

Вы могли бы сделать переменную статической?

void someRepeatedlyCalledFunction () {
    static Symbol _HardCodedSymbolString;
    if (!_HardCodedSymbolString.isSet())
        _HardCodedSymbolString = Symbol("HardCodedSymbolString");

    doThingWithSymbol(_HardCodedSymbolString);
}

В качестве альтернативы было бы еще лучше, если бы жестко закодированные значения символов были добавлены в список во время компиляции, поэтому правильные значения символов вставляются как константы - но я не вижу способаделать это без написания какого-то пользовательского шага препроцессора.

Должно быть достаточно просто написать быстрый генератор кода (на любом языке, который вы предпочитаете)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...