c++ - 如何优化硬编码符号的查找?
问题描述
我正在制作一个实现Symbol
类(类似于Atom
在 XLib 或:symbols
ruby 中)的 C++ 应用程序,它本质上将字符串映射到查找表中的每个字符串唯一的整数值。
这意味着初始化aSymbol
是唯一需要花费大量时间的部分,每次创建 a 时都在查找表中进行搜索。
通常这只是一个必要的邪恶,但这样做会变得很痛苦:
void someRepeatedlyCalledFunction () {
doThingWithSymbol(Symbol("HardCodedSymbolString"));
}
这意味着每次我调用这个函数时,整个符号查找都会再次发生。
当然,这可以通过以下方式避免:
Symbol _HardCodedSymbolString;
void someRepeatedlyCalledFunction () {
if (!_HardCodedSymbolString.isSet())
_HardCodedSymbolString = Symbol("HardCodedSymbolString");
doThingWithSymbol(_HardCodedSymbolString);
}
但这是一件必须经常做的没有吸引力的事情,所以理想情况下它可以隐藏在宏后面 -_SYMBOL(name)
或类似的东西。这样做的问题是,因为这个宏会在一个函数中被调用,所以没有办法为那个符号定义全局变量。
或者,如果在编译时将硬编码的符号值添加到列表中会更好,因此正确的符号值会像常量一样放入 - 但我认为如果不编写某种自定义预处理器步骤就无法做到这一点。
有没有办法实现这些解决方案,或者更好的解决方案?
解决方案
您可以使变量静态吗?
void someRepeatedlyCalledFunction () {
static Symbol _HardCodedSymbolString;
if (!_HardCodedSymbolString.isSet())
_HardCodedSymbolString = Symbol("HardCodedSymbolString");
doThingWithSymbol(_HardCodedSymbolString);
}
或者,如果在编译时将硬编码的符号值添加到列表中会更好,因此正确的符号值会像常量一样放入 - 但我认为如果不编写某种自定义预处理器步骤就无法做到这一点。
应该很容易编写快速代码生成器(使用您喜欢的任何语言)
推荐阅读
- javascript - 这段 JS 代码的正确 Java 等价物是什么?
- python - 如何使用 aiohttp 重定向 POST 请求
- asp.net-core-2.1 - 请求中指定 Azure AD 回复 url 的 ASP.NET Core Web 应用与配置的回复 url 不匹配
- ios - 为什么我的 iOS 应用程序可能会卡在 Apple 评论者的闪屏上,而我却不会?
- javascript - Swiper滑块:如何使图像更小但仍覆盖整个窗口?
- javascript - 为什么我的对象没有在 JavaScript 中以编程方式正确添加到选择元素?
- c++ - ftree-vectorize 标志导致 gcc 4.8.5 中的段错误,但在 gcc 4.4.7 中有效
- wordpress - 如何在 WooCommerce 中将供应商电子邮件通知收件人设置为供应商电子邮件而不是管理员电子邮件?
- apache-spark - 找不到源 KAFKA 的 Kafka Spark Streaming 归档
- java - 寻找更好的方法来识别图像中表格中的文本和符号并导出到 CSV