字符串到flywweights的字符串转换:更好的性能选项

string to flyweights of string conversion: Better performance option

本文关键字:字符串 性能 选项 更好 转换 flywweights      更新时间:2023-10-16

所以我有一个字符串类型的轻量级:

typedef boost::flyweight< std::string, boost::flyweights::intermodule_holder > SymbolName_t;

我想把这个例子推到它们的向量中,但天真的方法行不通:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( str ); // <--- won't compile
}

所以我添加了一个临时构造函数:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( SymbolName_t(str) ); // <--- compiles ok
}

我的问题是:考虑到语言的限制,这种方法是最优的吗?通过提供静态转换运算符等其他方式实现这一点会带来什么好处?我不认为通过非显式构造函数进行隐式转换是一个有效的选项,因为这需要修改boost::flyweight模板

如果您有C++11编译器,您可以使用emplace_back而不是push_back,这样就不需要拷贝了。

根据我对C++的了解,上面的代码可能是你最好的选择,因为你要传递对列表的引用(没有调用赋值或复制构造函数),获得对字符串的引用(同样,没有赋值或复制构造器),然后将新构建的SymbolName_t推送到你的列表上。不幸的是,STL容器对其参数的副本进行操作,因此此时将调用复制构造函数或赋值运算符(我不记得std::list在这里使用了哪一个)。其他选项可能包括使用转换运算符,但列表仍必须构造初始对象,然后将其复制到STL容器。即使使用不同的STL容器,这仍然是正确的。所以转换运营商不会真的给你买任何东西,IMHO。

你上面的代码("compiles-ok"块)可能是你最好的选择。在STL容器的限制下,我想不出更有效的方法了。您也许可以通过使用shared_ptrSymbolName_t来获得一些性能,但由于boost:flyweight在管理内存方面已经进行了优化,如果有很多重复的字符串,我不确定这能为您带来多少好处。