10

我目前正在使用非常聪明的包boost::const_string,直到http://libcxx.llvm.org/在 Ubuntu 上预打包或 GCC 使其__versa_string(在 header 中ext/vstring.h)成为默认字符串实现。libcxxstd::string以及__versa_string默认情况下使用 _small-string 优化 (SSO)。std::ostream但是,缺少对输出到 an 的默认支持。编码

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

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

除非我们强制进入x一个 c 字符串,否则它不起作用c_str()

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()已经知道并且不需要通过搜索来NULL计算c_str()。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?

4

3 回答 3

3

我错过了什么吗?

是的,只需包括const_string/io.hpp. 然而,它所做的只是:

return o << std::basic_string<char_type, traits_type>(s.data(), s.size());
于 2011-04-21T10:20:02.653 回答
2

似乎这可能会基于应用到字符串流的语言环境和/或方面产生影响,而不是像你正在做的那样编写直接数据。

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

于 2011-04-20T14:38:09.307 回答
1

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

于 2011-04-20T20:06:09.940 回答