2011-04-20 87 views
10

我目前使用的非常巧妙包装boost::const_string const_string直到http://libcxx.llvm.org/提供预打包在Ubuntu或GCC使其__versa_string(在头ext/vstring.h)的默认字符串实现。 libcxx的std::string以及__versa_string默认使用_small-string优化(SSO)。但缺乏输出到std::ostream的默认支持。该代码支持中的std :: ostream的运营商<<

#include <iostream> 
#include <boost/const_string.hpp> 

const_string<char> x; 
std::cout << x << endl; 

不起作用,除非我们迫使x成通过c_str()一个C字符串变成

std::cout << x.c_str() << endl; 

来编译和按预期工作。添加以下行来const_string.hpp

template <typename T> 
inline std::ostream & operator << (std::ostream & os, const boost::const_string<T> & a) 
{ 
    return os.write(a.data(), a.size()); 
} 

这应该提高性能超过x.c_str()因为size()是已知的,不需要通过如在c_str()搜索NULL计算。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?

+3

这取决于你想为非打印字符(尤其是'\ 0')想要的行为,我猜。我认为(!)普通字符串的默认行为是在空字符后截断。你的实现可能不会那样做。顺便说一句,+1使我意识到'boost :: const_string'。 – 2011-04-20 13:51:35

+3

我认为这是一种权衡。 据我所见,你的代码并不反映像 'std :: setw'这样的操纵器设置。 如果你不把'const_string'这些操纵器, 我认为你的代码有它自己的用处。 – 2011-04-20 15:05:03

回答

3

我错过了什么吗?

是的,只包括const_string/io.hpp。然而,它只是:

return o << std::basic_string<char_type, traits_type>(s.data(), s.size()); 
+0

与我的选择一样快吗? – 2011-04-21 13:34:15

+1

@Nordlöw:很有可能,例如它构造了一个临时的'basic_string' - 但是你不必再处理locales等。无论如何,如果它真的在你的应用程序中很重要,我会测量它。 – 2011-04-21 13:38:06

2

看起来,这可能会影响基于应用于字符串的字符串的区域设置和/或方面,而不是像您所做的那样直接写入直接数据。

它的性能会降低,但是如何从const_string创建一个std :: string并使用<<将其插入到流中呢?

+0

感谢您的意见。那么我如何支持区域设置? – 2011-04-21 09:59:07

1

不(你没有错过任何东西,afaik)。如果你的目标不是复制内容,str.data()是要走的路。