C++ IOStreams являются смехотворно неэффективными (в большинстве известных мне реализаций). Часто это не проблема, но когда это проблема, библиотека практически бесполезна. Также хорошо, что синтаксис не интуитивно понятен (и очень, очень многословен). Библиотека сложна и ее трудно расширять. Тоже не очень гибкий. По сравнению с чем-то вроде STL IOStreams действительно выглядит как страшный сон. Но это здесь, и мы застряли с этим.
Причина, по которой он здесь, и причина, по которой он выглядит так, заключается в том, что он был разработан раньше, до того, как C++ стал зрелым языком. До этого у нас был многолетний опыт, рассказывающий нам, что такое хороший дизайн библиотеки, а что нет. Прежде чем кто-либо действительно знал, какие варианты были.
C++ нуждалась в библиотеке ввода/вывода, которая была лучше, чем C. И в некоторых важных отношениях C++ IOStreams лучше. Как уже упоминалось, они безопасны для типов и расширяемы. Реализуя один оператор, я могу распечатать определяемый пользователем класс. Этого нельзя было сделать с printf. Мне также не нужно беспокоиться о неправильном определении спецификаторов формата и выводе мусора из-за отсутствия безопасности типов.
Эти вещи необходимо исправить. И эй, в первые дни виртуальные функции и перегрузка операторов были дерьмом. Это выглядело круто. Конечно, библиотеки хотели использовать эти возможности.
Библиотека IOStreams представляет собой компромисс между:
- что-то более безопасное и расширяемое, чем C
stdio.h
- что-то эффективное
- что-то хорошо продуманное и интуитивно понятное
- библиотека, которая фактически существовала во времена стандартизации C++. (они должны были что-то добавить, поэтому им пришлось выбирать между кандидатами, которые действительно существовали в то время.)
Библиотека не достигает всего этого, и я считаю, что сегодня, с нашим многолетним опытом работы с языком, мы могли бы разработать гораздо лучшую библиотеку. Но еще в середине 90-х, когда они искали библиотеку ввода-вывода для добавления, это было лучшее, что они могли найти.
person
jalf
schedule
30.04.2010