Насколько я понимаю, шаблоны выражений как метод были обнаружены значительно раньше, чем исходный стандарт C ++ в 1998 году. Почему они не использовались для повышения производительности нескольких стандартных классов, таких как std::string
и потоки?
17
operator+
, вы могли бы получитьO(n)
и обнулить избыточные выделения для повторных распределений, что все же быстрее, чем ссылки на rvalue. Кроме того, вы можете оптимизировать, например, реализации COW, копируя при записи , а не просто «по индексу в неконстантный». Существуют и другие приложения, в которых производительность и семантика могут быть улучшены с помощью шаблонов выражений.Ответы:
Шаблоны выражений были впервые опубликованы Тоддом Вельдхуйзеном в июне 1995 года в статье в журнале C ++ Report . К тому времени комитет по стандартизации уже активно участвовал в добавлении STL в стандарт C ++, и эта задача сама по себе задержала стандарт на один или два года. (STL был представлен комитету в 1993 году, а официально предложен в 1994 году. Потребовалось еще четыре года, чтобы закончить стандарт.)
Учитывая, что комитет по стандартизации C ++ представляет собой группу добровольцев, некоторые из них даже не поддерживаются компаниями, платящими свои я не думаю, что у кого-то есть какие-то ресурсы для добавления еще одной идеи в стандарт C ++.
Кроме того, 1995 год - только год, когда была опубликована статья Вельдхуйзена. Чтобы техника стала известной и узнаваемой , потребовалось бы еще несколько лет . (Идея STL восходит к 70-м годам, реализация Ada была сделана в конце 80-х, работа над реализацией C ++ должна была начаться примерно в 1990 году, и потребовалось еще три года, чтобы идея нашла путь к стандартизации C ++. комитет.)
Однако прошло всего три года от статьи Тодда до окончательного голосования по стандарту. Это было слишком мало времени, чтобы включить идею, которая все еще была совершенно новой и в основном не проверенной.
Добавьте к этому тот факт, что Expression Templates , являясь разновидностью шаблонного метапрограммирования, подчеркивает компиляторы гораздо больше, чем сравнительно «простой» STL. И насколько я помню, даже в 1998 году, когда был опубликован стандарт, у нас не было компилятора, который мог бы даже скомпилировать весь STL.
Учитывая, что одной из основных целей комитета по стандартизации была стандартизация устоявшейся практики (а не то, что они строго придерживались этого), шаблоны выражений никогда не должны были быть в повестке дня.
источник
std::string
и iostreams не было в STL.std::string
был изменен, чтобы превратить его в контейнер STL, кстати.)Ответ прост: вы явно не лоббировали это. И я этого не сделал, потому что у меня была (и есть) собственная повестка дня, которая не включает шаблоны выражений. Кроме того, интерфейс, в частности для строк, уже пытается обслуживать слишком много мастеров, в результате чего получается класс, который используется для всего и хорош для ничего.
В стандартной библиотеке уже есть
std::valarray
и семейство, которое предназначено для поддержки стиля реализации шаблона выражения. Насколько я могу судить, это не совсем так. Одна из причин, которая привела к этому, заключается в том, что люди, которые лоббировали, чтобы его полуготовая версия была включена в стандарт, перестали работать в нем, как только он был включен. Были попытки спасти его (например, Дэвид Вандевурде, Мэтт Остерн, и я работал над этим в течение дня или около того на встрече в Стокгольме), но в итоге никто не был достаточно заинтересован.источник
:)
Техника, теперь известная как «шаблоны выражений», была открыта (независимо) по крайней мере еще в 1994 году и Тоддом Вельдхуйзеном, и мной (статья Тодда от 1995 года, но для публикации материала требуется некоторое время; моя собственная работа). впервые был показан в comp.lang.c ++).
Я действительно начал посещать заседания комитета C ++ именно из-за этой проблемы. Я представил технику и полный редизайн std :: valarray комитету на первом совещании в Санта-Крузе в марте 1996 года. Это было сочтено слишком большим изменением, но, как намекает Дитмар, мы получили несколько слов на следующем собрании в Стокгольме, которые позволяют использовать шаблоны выражений для реализации std :: valarrray. К моему удивлению, эти слова все еще там: см. Пункт 3-6 подраздела [valarray.syn] 29.7.1 в http://wg21.link/N4727 .
источник
Я думаю, что ни один компилятор не смог бы скомпилировать шаблоны выражений еще в 1998 году.
источник
:->
Кроме того, они не смогли улучшить его достаточно быстро, поэтому быстро становилось все труднее использовать быстро улучшающиеся методы шаблонов с ним. Когда был выпущен VC7.1, и он был намного более послушным, это убило Borland.