首页 > 解决方案 > 如何优化硬编码符号的查找?

问题描述

我正在制作一个实现Symbol类(类似于Atom在 XLib 或:symbolsruby​​ 中)的 C++ 应用程序,它本质上将字符串映射到查找表中的每个字符串唯一的整数值。

这意味着初始化aSymbol是唯一需要花费大量时间的部分,每次创建 a 时都在查找表中进行搜索。

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

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

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

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

Symbol _HardCodedSymbolString;

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

    doThingWithSymbol(_HardCodedSymbolString);
}

但这是一件必须经常做的没有吸引力的事情,所以理想情况下它可以隐藏在宏后面 -_SYMBOL(name)或类似的东西。这样做的问题是,因为这个宏会一个函数中被调用,所以没有办法为那个符号定义全局变量。

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

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

标签: c++staticlookuppreprocessor

解决方案


您可以使变量静态吗?

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

    doThingWithSymbol(_HardCodedSymbolString);
}

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

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


推荐阅读