我这个人总是喜欢在写代码时追求极致,比如总是纠结于变量的命名,内存的消耗,执行的效率,接口的便捷性,代码的可扩展性。。。但很多时候需要在他们之间做取舍,这就导致我在编码时经常陷入僵局,唉。。。真是程序员的可悲,为此几年前我还专门将自己的CSDN签名改成了现在这样。
今天我又带来一个函数,相比网上其他版本效率更高(不存在额外拷贝问题),使用更便捷(无需预先分配缓存)。
起初我设计的函数如下:相比网上其他的Format,特点是降低了内存消耗,也提升了使用的便捷性,但带来了执行效率的下降,而更严重的是存在多线程隐患,不推荐使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
const std::string& StrUtil::Format( const char * pszFmt, ...) { va_list body; va_start (body, pszFmt); int nChars = _vscprintf(pszFmt, body); std::mutex mtx; mtx.lock(); static std::string str; // 非线程安全,因此下面使用互斥锁 str.resize(nChars + 1); vsprintf (( char *)str.c_str(), pszFmt, body); mtx.unlock(); va_end (body); return str; // 非线程安全 } |
然后,我又设计出了第二个Format方案。上个方案之所以在函数内部使用了static变量,是为了解决函数返回后变量“str”销毁的问题,这也是能让一个Format好用的关键问题所在——“如何能在函数返回后,构建好的字符串仍然能够在内存短暂驻留”,如下(利用临时对象特性保证内存短暂驻留)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/************************************************************************* ** Desc : 好用的格式化字符串“函数”,使用方法: ** printf(StrUtil::Format("%,%s", "hello", "world").c_str()); ** Param : [in] pszFmt ** : [in] ... ** Return : std::string ** Author : xktesla *************************************************************************/ class StrUtil { public : struct Format : std::string { public : Format( const char * pszFmt, ...) { va_list body; va_start (body, pszFmt); int nChars = _vscprintf(pszFmt, body); this ->resize(nChars + 1); vsprintf (( char *) this ->c_str(), pszFmt, body); va_end (body); } private : Format() = delete ; Format( const Format&) = delete ; Format& operator=( const Format&) = delete ; }; }; |
到此这篇关于好用的C++ string Format“函数”介绍的文章就介绍到这了,更多相关C++ string Format内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/xk641018299/article/details/122153434