我正在编写一个自定义记录器,我在std::stringstream
中缓冲我的日志消息,并在std::ofstream
足够大时将其刷新到文件(std::stringstream
)(以节省一些IO)潜伏) 。由于std::stringstream
没有.size()
方法,我使用seekg
和tellg
:
template <typename T>
MyClass & operator<< (const T& val)
{
boost::unique_lock<boost::mutex> lock(mutexOutput);
output << val; //std::stringstream output;
output.seekg(0, std::ios::end);
if(output.tellg() > 1048576/*1MB*/){
flushLog();
}
return *this;
}
问题:
在我看来,每当我调用此方法时,它使用seekg
开始计算从开头一直到结尾的字节,并使用tellg
获取大小。我想出了这个设计以节省一些IO时间,但是:这不是连续计数会产生更大的成本(如果对这种方法的调用次数很高而且日志消息很小,就像在大多数情况下一样) )?
有更好的方法吗?
还有一个侧面问题:1MB
是否是现今正常计算机中缓冲区大小的一个很好的数字?
谢谢
答案 0 :(得分:2)
您可以使用ostringstream::tellp()
来获取字符串的长度。这是一个取自http://en.cppreference.com/w/cpp/io/basic_ostream/tellp的例子。
#include <iostream>
#include <sstream>
int main()
{
std::ostringstream s;
std::cout << s.tellp() << '\n';
s << 'h';
std::cout << s.tellp() << '\n';
s << "ello, world ";
std::cout << s.tellp() << '\n';
s << 3.14 << '\n';
std::cout << s.tellp() << '\n' << s.str();
}
输出:
0 1 13 18 hello, world 3.14