3

我测试了以下两个代码片段,发现代码片段 A 比代码片段 B 更高效。为什么?str()有复制操作但rdbuf()没有。str("")比 贵吗str()

代码片段A:

ofstream out("foo.txt");
stringstream ss;
for(int i = 0; i < 300000; i++) {
    // append long text to ss
    out<<ss.str();
    ss.seekp(ios_base::beg);
}
out.close();

代码片段 B:

ofstream out("foo.txt");
stringstream ss;
for(int i = 0; i < 300000; i++) {
    // append long text to ss
    out<<ss.rdbuf();
    ss.str("");
}
out.close();
4

2 回答 2

3

可以检测到两个电位差:

out<<ss.str();将数据复制为std::basic_string,其中out<<ss.rdbuf();返回类型的指针std::basic_streambuf<CharT,Traits>

ss.str("");替换字符串流中的内容,其中ss.seekp(ios_base::beg);仅设置输出位置指示符

附言。

ss.str("")并且ss.str()是两种不同的操作。请参阅: http ://en.cppreference.com/w/cpp/io/basic_stringstream/str

于 2013-06-06T15:01:51.837 回答
1

令人困惑的是,ss.str()不做同样的事情ss.str("")

ss.str()返回底层字符串的副本,而ss.str(const string&)更改底层存储。

文档

于 2013-06-06T15:02:23.590 回答