好用的C++ string Format“函數(shù)”介紹
我這個(gè)人總是喜歡在寫(xiě)代碼時(shí)追求極致,比如總是糾結(jié)于變量的命名,內(nèi)存的消耗,執(zhí)行的效率,接口的便捷性,代碼的可擴(kuò)展性。。。但很多時(shí)候需要在他們之間做取舍,這就導(dǎo)致我在編碼時(shí)經(jīng)常陷入僵局,唉。。。真是程序員的可悲,為此幾年前我還專(zhuān)門(mén)將自己的CSDN簽名改成了現(xiàn)在這樣。
今天我又帶來(lái)一個(gè)函數(shù),相比網(wǎng)上其他版本效率更高(不存在額外拷貝問(wèn)題),使用更便捷(無(wú)需預(yù)先分配緩存)。
起初我設(shè)計(jì)的函數(shù)如下:相比網(wǎng)上其他的Format,特點(diǎn)是降低了內(nèi)存消耗,也提升了使用的便捷性,但帶來(lái)了執(zhí)行效率的下降,而更嚴(yán)重的是存在多線(xià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; // 非線(xiàn)程安全,因此下面使用互斥鎖 str.resize(nChars + 1); vsprintf((char*)str.c_str(), pszFmt, body); mtx.unlock(); va_end(body); return str; // 非線(xiàn)程安全 }
然后,我又設(shè)計(jì)出了第二個(gè)Format方案。上個(gè)方案之所以在函數(shù)內(nèi)部使用了static變量,是為了解決函數(shù)返回后變量“str”銷(xiāo)毀的問(wèn)題,這也是能讓一個(gè)Format好用的關(guān)鍵問(wèn)題所在——“如何能在函數(shù)返回后,構(gòu)建好的字符串仍然能夠在內(nèi)存短暫駐留”,如下(利用臨時(shí)對(duì)象特性保證內(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT中線(xiàn)程池QThreadPool類(lèi)概念和使用方法詳解
這篇文章主要為大家介紹了QT中線(xiàn)程池QThreadPool類(lèi)概念和使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
本篇文章是對(duì)使用OpenGL實(shí)現(xiàn)3D立體顯示的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法
這篇文章主要介紹了C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下2015-08-08基于C語(yǔ)言實(shí)現(xiàn)UDP服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的UDP服務(wù)器程序,以及如何接收和處理客戶(hù)端發(fā)送的數(shù)據(jù),有需要的小伙伴可以了解下2024-10-10C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02C語(yǔ)言中判斷兩個(gè)IPv4地址是否屬于同一個(gè)子網(wǎng)的代碼
這篇文章主要介紹了C語(yǔ)言中判斷兩個(gè)IPv4地址是否屬于同一個(gè)子網(wǎng)的代碼,需要的朋友可以參考下2017-09-09ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12