如何优化硬编码符号的查找?

时间:2019-05-07 03:13:26

标签: c++ static lookup preprocessor

我正在制作一个实现Symbol类的C ++应用程序(类似于XLib中的Atom或ruby中的:symbols),该类实际上将一个字符串映射为查找表中的字符串整数值。

这意味着初始化 Symbol是使用一个花费大量时间,每次创建一个查找表都进行搜索的唯一部分。

通常这只是必要的邪恶,但是这样做会很痛苦:

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

这意味着每次我调用此函数时,整个符号查找都会再次发生。

当然,可以通过以下方式避免这种情况:

Symbol _HardCodedSymbolString;

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

    doThingWithSymbol(_HardCodedSymbolString);
}

但这是经常要做的没有吸引力的事情,因此理想情况下,它可以隐藏在宏_SYMBOL(name)或类似的东西后面。问题在于,由于将从内部函数中调用此宏,因此无法为该符号定义全局变量。

或者,如果在 compile-time 时将硬编码的符号值添加到列表中,甚至会更 ,因此将正确的符号值像常量一样放入-但我认为如果不编写某种自定义预处理程序步骤就无法做到这一点。

是否有实现这些解决方案的方法,或者是更好的解决方案?

1 个答案:

答案 0 :(得分:-3)

您可以将变量设为静态吗?

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

    doThingWithSymbol(_HardCodedSymbolString);
}
  

或者,如果将硬编码的符号值设置为   在编译时添加到列表中,因此放置了正确的符号值   像常量一样-但我认为没有编写就无法做到这一点   某种自定义预处理器步骤。

应该足够容易编写快速的代码生成器(使用您喜欢的任何语言)