假设我需要调用一个从代码中大量位置获取常量std::string引用的函数foo:
int foo(const std::string&);
..
foo("bar");
..
foo("baz");像这样使用字符串文字调用函数将创建临时std::string对象,每次都会复制文字。
除非我弄错了,否则编译器不会通过为每个文本创建一个可以在后续调用中重用的静态std::string对象来优化这一点。我知道g++具有高级字符串池机制,但我不认为它会扩展到std::string对象本身。
我可以自己做这个“优化”,这会降低代码的可读性:
static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);使用Callgrind,我可以确认这确实加速了我的程序。
我想我应该试着为这个做一个宏,但我不知道这是否可能。我想要的是:
foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));我尝试使用文本作为模板参数来创建模板,但事实证明这是不可能的。由于在代码块中定义函数是不可能的,所以我完全没有想法了。
有没有一种优雅的方式来做这件事,或者我将不得不求助于可读性较差的解决方案?
发布于 2014-09-09 17:19:28
您可以使用Boost.Flyweight创建从const char*到std::string的key-value flyweight。我不确定细节,可能是到处使用flyweight<std::string>就足够了。
https://stackoverflow.com/questions/25740734
复制相似问题