Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于字符串的模板库提供了高效的连接_C++_Template Meta Programming - Fatal编程技术网

C++ 用于字符串的模板库提供了高效的连接

C++ 用于字符串的模板库提供了高效的连接,c++,template-meta-programming,C++,Template Meta Programming,是否有一个与blitz++字符串库等效的库(即通过延迟字符串构建直到读取整个表达式来提高字符串构建/操作性能的库) Blitz++通过模板元编程提高了矩阵/向量运算的速度,在编译时从a+B+C等表达式构造“语法树”,然后计算语法树。例如,这种方法可以提高字符串连接的性能,因为在看到类似于s1+s2+s3的表达式后,结果的大小将是已知的,这样就可以一步完成内存分配和复制,而不是先为s1+s2分配内存,然后进行复制,为(s1+s2)+s3分配内存,然后再次复制。我知道QString使用表达式模板确定

是否有一个与blitz++字符串库等效的库(即通过延迟字符串构建直到读取整个表达式来提高字符串构建/操作性能的库)


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

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

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

请看一看,以获取有关该技术的示例


请注意,这确实会干扰使用表达式模板
运算符+
的情况,例如
decltype(a+b)
auto c=a+b
,因为返回的类型是代理类型,而不是原始类型的
a
b

我似乎记得几年前有人在Boost邮件列表上讨论过这一点。