用于提供高效串联的字符串的模板库

时间:2012-11-11 17:28:41

标签: c++ template-meta-programming

是否存在与字符串的blitz ++库相当的(即通过延迟字符串构建直到读取整个表达式来提高字符串构造/操作性能的库)?

Blitz ++通过模板元编程提高矩阵/向量操作的速度,在编译时从A + B + C等表达式构建“语法树”,然后评估语法树。例如,这种方法可以提高字符串连接的性能,因为在看到类似s1 + s2 + s3的表达式之后,结果的大小将是已知的,这样内存分配和复制就可以在一个步骤中完成,而不是先为s1 + s2分配内存,复制,为(s1 + s2) + s3分配内存,然后再次复制。

1 个答案:

答案 0 :(得分:1)

我知道QString使用表达式模板来确定最终字符串的大小,并事先有效地分配它。我认为底层代码并不那么难,并且可以与大多数现有的字符串类一起使用。从Qt 4.8手册:

  

QStringBuilder使用表达式模板并重新实现'%'运算符,这样当您使用'%'进行字符串连接而不是'+'时,多个子字符串连接将被推迟到最终结果即将分配给QString。此时,已知最终结果所需的存储量。然后调用内存分配器一次以获得所需的空间,并将子字符串逐个复制到其中。

请查看wiki on the subject以获取有关该技术的示例。

请注意,这确实会干扰使用表达式模板decltype(a+b)的{​​{1}}或auto c = a+b之类的内容,因为返回的类型是代理类型,而不是原始类型{ {1}}或operator+