【问题标题】:string to flyweights of string conversion: Better performance option字符串到字符串转换的flyweights:更好的性能选项
【发布时间】:2012-04-09 13:57:51
【问题描述】:

所以我有一个字符串类型的享元:

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++ boost stdstring flyweight-pattern


    【解决方案1】:

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

    【讨论】:

    • 还有临时的需要,当你在它的时候。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多