Почему стандарт C ++ не принял шаблоны выражений?

17

Насколько я понимаю, шаблоны выражений как метод были обнаружены значительно раньше, чем исходный стандарт C ++ в 1998 году. Почему они не использовались для повышения производительности нескольких стандартных классов, таких как std::stringи потоки?

DeadMG
источник
@ChrisLively: Если бы я должен был представить предложение, предлагающее такое изменение, то было бы абсолютно проблемой, что я не знал, почему это не было сделано в первый раз, и это абсолютно актуально для программирования, и ответ очень конкретный.
DeadMG
Что именно вы будете делать с шаблонами выражений для ускорения строк?
Джалф
5
@jalf: Если бы вы применили его operator+, вы могли бы получить O(n)и обнулить избыточные выделения для повторных распределений, что все же быстрее, чем ссылки на rvalue. Кроме того, вы можете оптимизировать, например, реализации COW, копируя при записи , а не просто «по индексу в неконстантный». Существуют и другие приложения, в которых производительность и семантика могут быть улучшены с помощью шаблонов выражений.
DeadMG
Я понимаю, что этот вопрос был задан некоторое время назад, но, пожалуйста, уточните, что такое шаблоны выражений и / или ссылки на соответствующие материалы.
einpoklum

Ответы:

17

Шаблоны выражений были впервые опубликованы Тоддом Вельдхуйзеном в июне 1995 года в статье в журнале C ++ Report . К тому времени комитет по стандартизации уже активно участвовал в добавлении STL в стандарт C ++, и эта задача сама по себе задержала стандарт на один или два года. (STL был представлен комитету в 1993 году, а официально предложен в 1994 году. Потребовалось еще четыре года, чтобы закончить стандарт.)
Учитывая, что комитет по стандартизации C ++ представляет собой группу добровольцев, некоторые из них даже не поддерживаются компаниями, платящими свои я не думаю, что у кого-то есть какие-то ресурсы для добавления еще одной идеи в стандарт C ++.

Кроме того, 1995 год - только год, когда была опубликована статья Вельдхуйзена. Чтобы техника стала известной и узнаваемой , потребовалось бы еще несколько лет . (Идея STL восходит к 70-м годам, реализация Ada была сделана в конце 80-х, работа над реализацией C ++ должна была начаться примерно в 1990 году, и потребовалось еще три года, чтобы идея нашла путь к стандартизации C ++. комитет.)
Однако прошло всего три года от статьи Тодда до окончательного голосования по стандарту. Это было слишком мало времени, чтобы включить идею, которая все еще была совершенно новой и в основном не проверенной.

Добавьте к этому тот факт, что Expression Templates , являясь разновидностью шаблонного метапрограммирования, подчеркивает компиляторы гораздо больше, чем сравнительно «простой» STL. И насколько я помню, даже в 1998 году, когда был опубликован стандарт, у нас не было компилятора, который мог бы даже скомпилировать весь STL.
Учитывая, что одной из основных целей комитета по стандартизации была стандартизация устоявшейся практики (а не то, что они строго придерживались этого), шаблоны выражений никогда не должны были быть в повестке дня.

SBI
источник
1
Но std::stringи iostreams не было в STL.
Р. Мартиньо Фернандес
@ R.MartinhoFernandes: Это не значит, однако, что у комитета есть какие-то ресурсы, чтобы сэкономить. (И std::string был изменен, чтобы превратить его в контейнер STL, кстати.)
sbi
2
Я думаю, что мне просто нужно связать это: Является ли std :: string частью STL?
Xeo
@Sbi ах, это имеет смысл.
Р. Мартиньо Фернандес
10

Ответ прост: вы явно не лоббировали это. И я этого не сделал, потому что у меня была (и есть) собственная повестка дня, которая не включает шаблоны выражений. Кроме того, интерфейс, в частности для строк, уже пытается обслуживать слишком много мастеров, в результате чего получается класс, который используется для всего и хорош для ничего.

В стандартной библиотеке уже есть std::valarrayи семейство, которое предназначено для поддержки стиля реализации шаблона выражения. Насколько я могу судить, это не совсем так. Одна из причин, которая привела к этому, заключается в том, что люди, которые лоббировали, чтобы его полуготовая версия была включена в стандарт, перестали работать в нем, как только он был включен. Были попытки спасти его (например, Дэвид Вандевурде, Мэтт Остерн, и я работал над этим в течение дня или около того на встрече в Стокгольме), но в итоге никто не был достаточно заинтересован.

Дитмар Кюль
источник
8
Вы начинаете немного несправедливо, потому что DeadMG не мог лоббировать это из-за того простого факта, что он едва перерос свои подгузники в то время и, вероятно, не достиг того уровня, когда он мог правильно произнести «C ++». :)
2012 года
7
Ужасно жаль, что, будучи малышом, я не получил лоббирование: P
DeadMG
1
Я понимаю, что не у всех была возможность влиять на стандарты. Хотя я регулярно посещаю заседания комитетов примерно с 15 лет, мое влияние на стандарт ограничено. Однако моя точка зрения такова: если кто-то хочет что-то в стандарте, ему нужно приложить усилия! Вещи, которых там нет, в основном сводятся к тому, что у людей есть другие приоритеты, будь то технические или иные (например, полная концентрация на взрослении).
Дитмар Кюль
Реализация libgcc valarray основывается на шаблонах выражений.
Френель
3

Техника, теперь известная как «шаблоны выражений», была открыта (независимо) по крайней мере еще в 1994 году и Тоддом Вельдхуйзеном, и мной (статья Тодда от 1995 года, но для публикации материала требуется некоторое время; моя собственная работа). впервые был показан в comp.lang.c ++).

Я действительно начал посещать заседания комитета C ++ именно из-за этой проблемы. Я представил технику и полный редизайн std :: valarray комитету на первом совещании в Санта-Крузе в марте 1996 года. Это было сочтено слишком большим изменением, но, как намекает Дитмар, мы получили несколько слов на следующем собрании в Стокгольме, которые позволяют использовать шаблоны выражений для реализации std :: valarrray. К моему удивлению, эти слова все еще там: см. Пункт 3-6 подраздела [valarray.syn] 29.7.1 в http://wg21.link/N4727 .

Дэйвид В.
источник
1
Интересно, какой смысл использовать сокращатель ссылок вместо реального URL
gnat
3
@gnat: Если вам известен номер документа, написать URL-адрес wg21.link просто. Это то, что я сделал здесь. Это спасает меня от поиска конкретной почтовой рассылки / года, в котором был выпущен документ. Также я надеюсь, что если / когда WG21 решит переместить URL-адреса хостинга, wg21.link будет соответствующим образом обновлен, что позволит избежать устаревших ссылок. (То есть дело не в сокращении, а в удобочитаемости.)
Дейвид В.
0

Я думаю, что ни один компилятор не смог бы скомпилировать шаблоны выражений еще в 1998 году.

fredoverflow
источник
1
Тодд Вельдхуйзен работал над своим шаблоном выражения до 1996 года, используя компилятор C ++ KAI. Причина гораздо более профана ...
1
Большой процент сообщества C ++ не мог использовать STL в полной мере до 2003 года (я смотрю на вас, Microsoft!), И это не помешало комитету включить STL в стандарт.
2012 года
2
На самом деле, bth Тодд и я изначально получили технику шаблонов выражений для работы на компиляторе Borland C ++ 4 (который был выпущен в 1993 году). Между прочим, я считаю, что это также первый компилятор, на котором STL был создан для полноценной работы. Позже я портировал библиотеку шаблонов выражений на множество других компиляторов (включая компилятор Sun на основе Cfront в то время!). Компилятор KAI C ++ появится чуть позже.
Дэйвид В.
@DaveedV. BCC4 был очень хорошим компилятором для своего времени и намного лучше, чем версия VC того времени! Тем не менее, он имел некоторые причуды, как печально известная «ошибка смайлика». :->Кроме того, они не смогли улучшить его достаточно быстро, поэтому быстро становилось все труднее использовать быстро улучшающиеся методы шаблонов с ним. Когда был выпущен VC7.1, и он был намного более послушным, это убило Borland.
СБИ