C#字符串格式化的C++實現

概要 C#字符串格式化的C++實現的步驟c++

緣由 之因此作這個實現,是由於避免由於格式化致使的運行時錯誤數組

C#的完整格式化信息能夠參考itjeff的這篇文章異步

先作個簡化版的,支持{0},{1},{2}等等,不支持大括號裏面的詳細格式化語法 第一步,收集格式化參數 定義一個SArgument的輕量級類,封裝各個基本類型的構造函數 如SArgument(int); SArgument(const char*); SArgument(float); SArgument(double); …(省略)函數

第二步,掃描解析 掃描並解析格式化字符串中的{0}模板 struct ReplacePoint{ int index; // argument index int offset; // in m_buffer; int length; // {\d+}的長度 }; 一個結構體ReplacePoint表示出現的格式化{\d+}的基本信息,後續能夠增長詳細的格式化信息 最終獲得ReplacePoint數組性能

第三步,字符串轉化 根據SArgument的原始類型信息以及ReplacePoint格式化信息,將其轉化爲字符串測試

第四步,字符串合併替換 針對每一個ReplacePoint,將格式化字符串中前面的原始內容拷貝 而後將其對應的SArgument參數產生的字符串拷貝優化

優勢 1.類型信息靜態捕捉:經過SArgument的各類構造函數抓捕,是否支持,編譯時刻便可發現; 2.使用簡單:使用的時候不用關心格式化,也不用關心格式化是否錯誤 原生的sprintf系列函數,寫錯了,就是運行時錯誤. 3.多個綁定:可支持如{0},{0},同一個參數可出現若干次設計

潛在的優勢 這個模式,對全異步的超高性能日誌很是友好日誌

全異步的超高性能日誌:進入公司後就作的一個日誌庫,相似log4j2,當初沒有c++版本,就考慮本身打造.沒有參考其設計,徹底本身按照極速來設計(後續會寫這個方面的博文) **很是友好 性能能夠達到調用花費2-3us(微秒)內存

知識點: 如何爲_vsnprintf_s_l定製化參數? 將每一個參數先後銜接的放在一塊內存中,模擬調用棧的參數內存,而後將此地址做爲最後一個參數調用便可;

使用範例 char buf[128] = { 0 }; int len=FMTBUF(buf, 「{0}-{1}-{2},{2}-{3}」, 「Hello World!」, 10.0f, 11.0f, 「45151515555555」); 最終buf內容以下: 「Hello World!-10.000000-11.000000,11.000000-45151515555555」 len爲57

性能對比 FMTBUF(buf, 「{0}-{1},{2}-{3}」, 「Hello World!」, 10.0f, 11.0f, 「45151515555555」); _snprintf_s(buf, sizeof(buf), _TRUNCATE, 「%s-%f,%f-%s」, 「Hello World!」, 10.0f, 11.0f, 「45151515555555」); 通過測試,非優化版,第一個性能是第二個的2倍,優化版,第一個是第二個的4倍

相關文章
相關標籤/搜索