我正在编写一个自定义记录器,我将日志消息缓冲在 a 中,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;
}
Run Code Online (Sandbox Code Playgroud)
问题:在我看来,每当我调用此方法时,它都会seekg从头到尾开始计算字节数,并使用tellg. 我想出这个设计首先是为了节省一些 IO 时间,但是:这种连续计数是否会带来更大的成本(如果在大多数情况下调用此方法的次数很高并且日志消息很小) )?
有一个更好的方法吗?
还有一个附带问题:1MB在当今的普通计算机中,缓冲区大小是一个很好的数字吗?
谢谢
您只需使用即可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();
}
Run Code Online (Sandbox Code Playgroud)
输出:
0 1 13 18 你好,世界3.14