Я делаю приложение на 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)
или чем-то в этом роде.Проблема в том, что, поскольку этот макрос вызывается из в функции, нет способа определить глобальную переменную для этого символа.
В качестве альтернативы, он был бы даже лучше , если жестко закодированные значения символов были добавлены в список в время компиляции , поэтому правильные значения символов вставляются как константы - но я не вижу способа сделать это без написания какого-либопользовательский шаг препроцессора.
Есть ли способ реализовать эти решения или, возможно, лучшее решение?