【发布时间】:2015-03-30 01:05:55
【问题描述】:
我有一个代码,它使用 std::ostringstream 向 std::string 写入一个数字:
template<class T>
class Converter
{
private:
static std::string s_buffer;
public:
static const char* Out(const T& val)
{
std::ostringstream os;
os << val;
s_buffer = os.str();
return(s_buffer.data());
}
};
Converter::Out 被调用了很多。以至于它甚至出现在分析器中。基本上,这里发生的是:
- 创建了一个 ostringstream 的实例
- 它创建一个要写入和写入的缓冲区
- 我将该缓冲区复制到静态字符串并返回
我认为,如果我可以让流直接写入静态字符串,从而避免复制,我可能会获得一些性能提升。但是我该怎么做 - std::ostringstream 在构造函数中只能接受 const std::string,这将是一个初步填充,而不是要写入的缓冲区。
也许 Boost 有其他选择,虽然我没有找到... :(
【问题讨论】:
-
可以通过调用
streambuf::pubsetbuf然后从streambuf构造流来指定你自己的缓冲区,但不幸的是它给你一个不可调整大小的缓冲区。 -
@vsoftco 我认为这是完全符合标准的代码,我希望好的实现能够做到这一点。问题是实际上有多少实现...
-
@jrok,我认为你不能从
std::stringstream移动...你绝对可以移动返回的字符串(我认为编译器应该自动执行此操作,因为std::string有一个移动构造函数/赋值运算符) -
您是否尝试过将
std::ostringstream osalso 类设为静态?另外,考虑通过返回std::string来更改函数签名(并从RVO中受益),如有必要,调用者可以调用std::string::c_str()