为什么C ++ Standard不采用表达式模板?


17

我的理解是,表达模板作为一种技术早在1998年最初的C ++ Standard之前就被发现。为什么不使用它们来提高像std::stringand stream 这样的几个标准类的性能?


@ChrisLively:如果我要提出一个建议来建议进行这样的更改,那绝对是个问题,我不知道为什么第一次不这样做,这绝对与编程相关,答案非常重要具体。
DeadMG 2012年

您将如何使用表达式模板来加速字符串?
2012年

5
@jalf:如果将其应用于operator+,则可以实现O(n)重复分配并将零冗余分配归零,这仍然比右值引用更快。另外,您可以通过在write上复制而不只是“在非常量索引上” 复制来优化例如COW实现。还有其他应用程序也可以使用表达式模板来提高性能和语义。
DeadMG 2012年

我知道这个问题是在不久前提出的,但是请详细说明什么是表达模板和/或链接到相关材料。
einpoklum 2015年

Answers:


17

表达模板最初由Todd Veldhuizen于1995年6 在《C ++ Report》杂志的一篇文章中发表。到那时,标准委员会已经在将STL添加到C ++标准中进行了大量工作,这项任务本身就将标准延迟了一两年。(STL于1993年提交给委员会,并于1994年正式提出。又花了四年的时间来完成该标准。)
鉴于C ++标准化委员会是一群志愿者,其中有些人甚至没有得到付费的公司的支持。费用,我认为没有人可以使用任何资源来为C ++标准添加另一个想法。

同样,1995年只是Veldhuizen文章发表的一年。为了使这项技术变得众所周知和被认可,还需要花费几年的时间。(STL的想法可以追溯到70年代,Ada实现是在80年代后期完成的,C ++实现的工作必须在1990年左右开始,并且又花了三年的时间才找到实现C ++标准化的方法。委员会。)
有,然而,从托德的文章,直到在标准的最终投票短短三年。花费很少的时间来整合仍然是全新的且基本上未经测试的想法。

此外,表达式模板是一种模板元编程,它使编译器比相对“简单”的STL更加注重压力。从我的记忆中,即使在1998年标准发布时,我们都没有一个可以编译所有STL的编译器。
鉴于标准化委员会的主要目标之一是标准化已建立的惯例(而不是严格遵循这一惯例),因此,那时的表达模板永远都不应放在议程上。


1
但是std::stringiostream不在STL中。
R. Martinho Fernandes 2012年

@ R.MartinhoFernandes:但这并不意味着该委员会有任何资源可以节省。(和std::string 改为把它变成一个STL容器,BTW)
SBI

2
我想我只需要链接一下:std :: string是STL的一部分吗?
Xeo 2012年

@sbi啊,那很有道理。
R. Martinho Fernandes 2012年

10

一个简单的答案是:显然没有为此游说。我也没有,因为我有(也有)自己的议程,其中不包括表达式模板。同样,特别是用于字符串的接口已经在尝试提供过多的母带,从而产生了一个用于所有事物并且对蛾类有益的类。

标准库已经有一个std::valarray家族,旨在支持一个表达模板样式的实现。据我所知,它还不能完全解决问题。导致此问题的一个问题是,游说将其包含在标准中的半烘焙版本的人们在将其包含进标准时就停止了工作。人们曾尝试营救它(例如,David Vandevoorde,Matt Austern,我在斯德哥尔摩会议上做了大约一天的研究),但最终没有人对此感兴趣。


8
您开始时有点不公平,因为DeadMG不能游说它,因为一个简单的事实:他当时几乎没有尿布,而且还没到可以正确发音“ C ++”的地步。:)
2012年

7
非常遗憾,作为一个蹒跚学步的孩子,我没有得到游说:P
DeadMG

1
我意识到并不是每个人都有机会影响标准。尽管自大约15年以来我定期参加委员会会议,但我对标准的影响有限。但是,我的意思是:如果有人想要某种标准的东西,他们需要付出努力!根本没有事情要归于其他优先事项,无论他们是技术人员还是其他人员(例如,全神贯注于成长)。
DietmarKühl2012年

valarray的libgcc实现基于表达式模板。
phresnel 2014年

3

现在被称为“表达模板”的技术至少是在1994年由Todd Veldhuizen和我本人(独立地)发现的(Todd的文章来自1995年,但是要花一些时间才能出版,我自己的作品最初显示在comp.lang.c ++中)。

正是由于这个问题,我实际上开始参加C ++委员会会议。我在1996年3月的第一届圣克鲁斯会议上向委员会介绍了该技术和std :: valarray的完整重新设计。这被认为太大了,但是正如Dietmar所暗示的那样,我们在随后的见面会上表达了一些话。在斯德哥尔摩,使表达式模板可用于实现std :: valarrray。令我惊讶的是,这些词仍然存在:请参阅http://wg21.link/N4727中的 [valarray.syn] 29.7.1小节中的3-6段。


1
想知道使用链接缩短器代替实际URL的意义是什么
gnat '18

3
@gnat:如果您知道文档编号,则为它编写wg21.link URL很简单。那就是我在这里所做的。它使我免于查找文档发布所在的特定邮件/年份。另外,我希望,如果/当WG21决定移动托管URL时,wg21.link将相应地进行更新,从而避免了过时的引用。(即,重点不是缩短,而是可读性。)
Daveed V.

0

我最好的猜测是,早在1998年就没有编译器能够编译表达式模板。


1
Todd Veldhuizen在1996年之前使用KAI的C ++编译器完成了表达模板的工作。原因更多是亵渎行为

1
直到2003年,很大一部分的C ++社区都无法充分利用STL(我正在看您,微软!),这并没有阻止委员会将STL纳入标准。
2012年

2
实际上,bth Todd和我最初获得了表达模板技术,可用于Borland C ++ 4编译器(于1993年发布)。顺便说一句,我相信这也是使STL能够完全发挥作用的第一个编译器。后来我将表达式模板库移植到了其他各种编译器(当时包括Sun基于Cfront的编译器!)。KAI C ++编译器稍后发布。
Daveed V.

@DaveedV。BCC4当时是一个非常好的编译器,比当时的VC版本好得多!不过,它确实有一些怪癖,例如臭名昭​​著的“笑脸虫”。:->另外,他们无法足够快地对其进行改进,因此使用快速改进的模板技术变得越来越困难。当VC7.1发布并且更加合规时,这使Borland丧命。
sbi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.