这个方法有几个好处:
1、通过检测 vsnprintf 的返回值,在 buffer 不够大时重新分配空间,可以做到按需分配,且不浪费空间
2、巧妙使用 thread_local :
(1)每个线程有独立的实例,保证了线程安全
(2)通过初始化(而非赋值),编译器保证只调用一次初始化
(3)static 修饰(默认自动会加),确保同一个线程内复用,不需要多次分配
void __cdecl test(const char* fmt, ...)
{
static thread_local std::string buf(1024, 0);
buf.clear();
do
{
va_list ap;
va_start(ap, fmt);
int ret = vsnprintf((char*)buf.data(), buf.capacity(), fmt, ap);
va_end(ap);
if (ret > buf.capacity()) { // buffer is too small
buf.resize(ret + 16, 0);
continue;
}
break;
} while (1);
std::cout<<buf<<std::endl;
}