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倍

相关文章
相关标签/搜索