Чому стандарт C ++ не прийняв шаблони виразів?


17

Наскільки я розумію, що шаблони виразів як техніка були виявлені значно раніше оригінального стандарту C ++ у 1998 році. Чому їх не використовували для підвищення продуктивності декількох стандартних класів, таких як std::stringпотоки?


@ChrisLively: Якби я подав пропозицію про таку зміну, то це була б абсолютно проблема, що я не знав, чому це не було зроблено в перший раз, і це абсолютно актуально програмування, і відповідь дуже специфічні.
DeadMG

Що саме ви зробили б із шаблонами виразів, щоб пришвидшити рядки?
jalf

5
@jalf: Якби ви застосували його operator+, ви могли б досягти O(n)і нульових надмірних виділень для повторних розподілів, що все ще швидше, ніж посилання на рецензію. Крім того, ви можете оптимізувати, наприклад, реалізацію COW, копіюючи функцію запису , а не лише "індексувати в non-const". Є й інші додатки, де ефективність та семантику можна покращити за допомогою шаблонів виразів.
DeadMG

Я усвідомлюю, що це питання було задано деякий час тому, але, будь ласка, докладно розкажіть про те, що таке шаблони виразів та / або посилання на відповідний матеріал.
einpoklum

Відповіді:


17

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

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

Додайте до цього той факт, що шаблони виразів , будучи своєрідним метапрограмуванням шаблонів, компілятори стресів набагато більше, ніж порівняно "прості" STL. І, як я пам’ятаю, навіть у 1998 році, коли стандарт був опублікований, у нас не було компілятора, який би навіть міг зібрати всі STL.
Зважаючи на те, що однією з головних цілей комітету зі стандартизації було стандартизація усталеної практики (не те, щоб вони суворо дотримувалися цього), Шаблони висловлювань тоді ніколи не повинні стояти на порядку денному.


1
Але std::stringі iostreams не були в STL.
Р. Мартіньо Фернандес

@ R.MartinhoFernandes: Однак це не означає, що у комітету були необхідні ресурси. (І std::string було змінено, щоб перетворити його на контейнер STL, BTW.)
sbi

2
Я думаю, що я просто повинен зв’язати це: Чи std :: string частина STL?
Ксео

@sbi ах, це має сенс.
Р. Мартіньо Фернандес

10

Проста відповідь: ви, очевидно, не лобіювали це. Я також не мав, оскільки у мене був (і є) свій власний порядок денний, який не включає шаблони виразів. Крім того, інтерфейс, зокрема для рядків, вже намагається служити занадто багато майстрам, в результаті чого виходить клас, який використовується для всього і корисний для мотінгу.

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


8
Ви починаєте трохи несправедливо, тому що DeadMG не міг лобіювати це через простий факт, що він ледве переріс підгузники тоді і, ймовірно, не досяг точки, де він міг правильно вимовити "C ++". :)
sbi

7
Жахливо шкода, що я, як малюк, не займався лобіюванням: P
DeadMG,

1
Я усвідомлюю, що не всі мали можливість впливати на стандарт. Хоча я регулярно відвідую засідання комітетів вже близько 15 років, мій вплив на стандарт обмежений. Однак моя думка така: якщо хтось хоче щось у стандарті, їм потрібно докласти зусиль! Те, чого там немає, по суті полягає в тому, щоб люди мали інші пріоритети, будь то технічні чи інші (наприклад, повністю зосереджені на дорослішанні).
Дітмар Кюль

Реалізація libgcc баз valarray на шаблонах виразів.
phresnel

3

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

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


1
Цікаво , що точка , використовуючи посилання Shortener замість реального URL
комар

3
@gnat: Якщо ви знаєте номер документа, тривіально написати URL-адресу wg21.link для нього. Ось що я тут зробив. Це допомагає мені шукати конкретні розсилки / рік, коли документ був випущений. Також я сподіваюся, що якщо / коли WG21 вирішить перемістити URL-адреси хостингу, wg21.link буде оновлено відповідно, таким чином уникнувши несвіжих посилань. (Тобто, справа не в укороченні, а в читанні.)
Дейв В.

0

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


1
Тодд Велдхуйзен працював над шаблоном виразів до 1996 року, використовуючи компілятор C ++ від KAI. Причина набагато більш негідна ...

1
Великий відсоток спільноти C ++ не зміг використати STL до повного потенціалу до 2003 року (я дивлюся на вас, Microsoft!), І це не зупинило комітет із включення STL до стандарту.
sbi

2
Власне, ми з Bth Todd спочатку отримали техніку шаблонів виразів для роботи над компілятором Borland C ++ 4 (який був випущений у 1993 році). Між іншим, я вважаю, що це також перший компілятор, над яким STL був зроблений для повноцінної роботи. Пізніше я переніс бібліотеку шаблонів виразів до різних інших компіляторів (включаючи компілятор на базі Cfront на Sun у той час!). Камера компілятора KAI C ++ трохи пізніше.
Дейв В.

@DaveedV. BCC4 був дуже хорошим компілятором для свого часу і набагато кращим, ніж версія VC того часу! У ньому були деякі примхи, хоча, як сумнозвісний "помилок смайлів". :->Плюс вони не змогли його вдосконалити досить швидко, тому швидко стало важче та складніше використовувати прийоми шаблонів, що швидко вдосконалюються. Коли VC7.1 був випущений і був набагато більш відповідальним, це вбило Borland.
sbi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.