【问题标题】:Support for const_string in std::ostream operator <<支持 std::ostream 运算符中的 const_string <<
【发布时间】:2011-08-09 12:33:06
【问题描述】:

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

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

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

除非我们通过 c_str()x 强制转换为 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 来计算。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?

【问题讨论】:

  • 这取决于你想要的不可打印字符的行为(尤其是\0),我猜。我认为(!)普通字符串的默认行为是在空字符后截断。你的实现可能不会那样做。顺便说一下,+1 让我知道boost::const_string
  • 我认为这是一种权衡。据我所知,您的代码没有反映像std::setw 这样的操纵器设置。如果你不使用const_string 的那些操纵器,我认为你的代码有它自己的用途。

标签: c++ templates string boost ostream


【解决方案1】:

我错过了什么吗?

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

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

【讨论】:

  • 这和我的选择一样快吗?
  • @Nordlöw:很有可能,例如它构造了一个临时的basic_string - 但是你不必再处理语言环境等。无论如何,如果它在你的应用程序中真的很重要,我会衡量它。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的 cmets。那我该如何支持区域设置呢?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2011-12-03
    相关资源
    最近更新 更多