好用的C++ string Format“函數(shù)”介紹
我這個(gè)人總是喜歡在寫代碼時(shí)追求極致,比如總是糾結(jié)于變量的命名,內(nèi)存的消耗,執(zhí)行的效率,接口的便捷性,代碼的可擴(kuò)展性。。。但很多時(shí)候需要在他們之間做取舍,這就導(dǎo)致我在編碼時(shí)經(jīng)常陷入僵局,唉。。。真是程序員的可悲,為此幾年前我還專門將自己的CSDN簽名改成了現(xiàn)在這樣。
今天我又帶來一個(gè)函數(shù),相比網(wǎng)上其他版本效率更高(不存在額外拷貝問題),使用更便捷(無需預(yù)先分配緩存)。
起初我設(shè)計(jì)的函數(shù)如下:相比網(wǎng)上其他的Format,特點(diǎn)是降低了內(nèi)存消耗,也提升了使用的便捷性,但帶來了執(zhí)行效率的下降,而更嚴(yán)重的是存在多線程隱患,不推薦使用。
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; // 非線程安全
}
然后,我又設(shè)計(jì)出了第二個(gè)Format方案。上個(gè)方案之所以在函數(shù)內(nèi)部使用了static變量,是為了解決函數(shù)返回后變量“str”銷毀的問題,這也是能讓一個(gè)Format好用的關(guān)鍵問題所在——“如何能在函數(shù)返回后,構(gòu)建好的字符串仍然能夠在內(nèi)存短暫駐留”,如下(利用臨時(shí)對象特性保證內(nèi)存短暫駐留)
/*************************************************************************
** Desc : 好用的格式化字符串“函數(shù)”,使用方法:
** 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;
};
};
到此這篇關(guān)于好用的C++ string Format“函數(shù)”介紹的文章就介紹到這了,更多相關(guān)C++ string Format內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別
主調(diào)函數(shù)使用被調(diào)函數(shù)的功能,稱為函數(shù)調(diào)用。在C語言/C++中,只有在函數(shù)調(diào)用時(shí),函數(shù)體中定義的功能才會被執(zhí)行,下面讓我們詳細(xì)來了解2022-05-05
C++中Semaphore內(nèi)核對象用法實(shí)例
這篇文章主要介紹了C++中Semaphore內(nèi)核對象用法實(shí)例,有助于深入了解信號量(Semaphore)的基本用法,需要的朋友可以參考下2014-10-10
C++實(shí)現(xiàn)正態(tài)隨機(jī)分布的方法
本篇介紹了,使用c++實(shí)現(xiàn)正態(tài)隨機(jī)分布的實(shí)現(xiàn)方法。需要的朋友參考下2013-05-05
C語言kmp算法簡單示例和實(shí)現(xiàn)原理探究
這篇文章主要介紹了C語言kmp算法簡單示例和實(shí)現(xiàn)原理探究,本文用簡潔的語言說明KMP算法的原理,并給出了示例,需要的朋友可以參考下2014-09-09

