字符串到flywweights的字符串转换:更好的性能选项
string to flyweights of string conversion: Better performance option
所以我有一个字符串类型的轻量级:
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_ptr
到SymbolName_t
来获得一些性能,但由于boost:flyweight
在管理内存方面已经进行了优化,如果有很多重复的字符串,我不确定这能为您带来多少好处。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 性能 - 使用字符串构造函数与使用串联
- C++和Java的字符串循环性能比较
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- MongoC ++驱动程序BSON构造:基于流与基于字符串解析.哪一个性能更好?
- STD ::移动性能,同时将大字符串作为rvalue
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 性能字符串作为函数参数
- C++字符串构造性能
- 字符串操作性能问题
- 字符串与哈希作为映射键 - 性能
- 通过 iStringStream 标记化的 C++ 字符串的性能开销
- 对于静态错误字符串,哪个的内存/性能效率更高,或者有替代方案
- std::用于处理短字符串的字符串性能
- 在将 char 数组复制到字符串期间节省 CPU 周期(提高性能)
- 性能字符串与字符串
- C++代码性能字符串进行比较
- 性能标准::strstr vs. 标准::字符串::查找
- 字符串到flywweights的字符串转换:更好的性能选项