Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 107
Текст из файла (страница 107)
Проектные решения стандартной библиотеки. Что должно входить в стандартную библиотеку языка С++? Для программиста было бы идеальным найти в библиотеке любые интересные и значимые классы, функции, шаблоны и т.д. Но вопрос задан по отношению именно к стандартной библиотеке, а не по отношению к некоторой библиотеке вообще, так что ответ »Все!» здесь неуместен. Стандартная библиотека должна включать в себя только то, что каждая реализация языка могла бы предоставить надехснейшим образом и на что кюкаый программист мог бы всегда опереться.
В итоге, стандартная библиотека языка С++: 1. Обеспечивает поддержку таких средств языка, как управление памятью (В6.2.6) н механизм КТТ1 (В15.4). 2. Предоставляет информацию о зависящих от реализации аспектах языка, таких как, например, максимальное значение типа Яоаг (в22.2). 3. Обеспечивает программиста функциями, которые невозможно одинаково оптимально выполнить лишь средствами самого языка, например щиО (В22.3) и теттоге() (519.4.6). Глава 16.
Организация библиотеки и контейнеры 518 4. Реализует такие непримитивные и переносимые средства, как списки (817.2.2), ассоциативные массивы (отображения) (817.4.!), функции сортировки (818.7.1) и потоки ввода/вывода (глава 21). 5. Формулирует архитектурные принципы, позволяющие расширять базовые средства библиотеки, например, соглашения и средства поддержки, позволяющие программисту обеспечивать ввод/вывод пользовательских типов в стиле ввода/вывода встроенных типов. б. Служит общим фундаментом для других библиотек. Кроме того, стандартная библиотека предостааляет некоторые программные средства, вроде генератора случайных чисел 522.7), просто потому, что так принято делать (и это удобно). Дизайн стандартной библиотеки в основном определялся последними тремя из перечисленных выше ее ролей.
Эти роли, к тому же, связаны между собой. Например, переносимость является важным критерием проектирования специализированных библиотек, а общие контейнерные типы, такие как списки и ассоциативные массивы, важны для обеспечения удобного взаимодействия между независимо разработанными библиотеками. Последняя роль особо важна с точки зрения дизайна, ибо она помогает очертить область применения стандартной библиотеки и ограничить входящие в нее средства. Например, строки и списки входят в стандартную библиотеку.
Если бы нх в ней не было, то независимые библиотеки могли бы взаимодействовать лишь только посредством встроенных типов. В то же время, никакой графики или распознавания графических образов в стандартной библиотеке нет. Это все безусловно полезные и широко применимые средства, но они редко когда используются непосредственно прн взаимодействии разных библиотек. В итоге, если некоторое средство не нужно для поддержки перечисленных ролей, его можно не включать в стандартную библиотеку. Это открывает другим библиотекам шанс предоставить конкурентоспособную реализацию такого средства. 16.1.1.
Проектные ограничения Отводимые стандартной библиотеке роли накладывают несколько ограничений на ее дизайн. Средства стандартной библиотеки языка С++ спроектированы так, чтобы они; 1. Были важными и доступными для каждого студента и профессионального программиста, включая разработчиков других библиотек. 2. Использовались прямо или косвенно любым программистом для решения любой задачи, относящейся к области стандартной библиотеки.
3. Были достаточно эффективными, чтобы при реализации иных библиотек эти средства могли составить естественную альтернативу функциям, классам и шаблонам, программируемым вручную. 4. Были независимыми от стратегии реализации (алгоритма) или позволяли пользователю задавать стратегию в качестве аргумента.
1б.1. Проектные решения стандартной библиотеки. 519 5. Были примитивными в математическом смысле, ибо эффективность компонента библиотеки, выполняющего две слабо связанные роли, наверняка будет хуже эффективности компонентов, каждый из которых выполняет лишь одну из ролей. 6. Были удобными, эффективными и безопасными для применения в типичных случаях. 7. Были полностью реализованными. Другим библиотекам можно оставить массу функциональности, но то, что реализовано в стандартной библиотеке, не должно нуждаться в переделках и дополнительной реализации базовых возможностей. 8.
Могли сочетаться со встроенными типами и операциями. 9. Были по умолчанию безопасными в отношении типов. 10. Поддерживали общепринятые стили программирования. 11. Были гибкими и расширяемыми и могли работать с пользовательскими типами так же, как со встроенными типами и типами из стандартной библиотеки. Например, жесткое кодирование критерия сравнения внутри функции сортировки неприемлемо, так как сортировка может производиться согласно разным критериям. Вот почему функция сортировки 9югг(1 из стандартной библиотеки языка С принимает функцию сравнения в качестве аргумента, а не полагается на что-то фиксированное вроде операции < (97.7). С другой стороны, излишние затраты на вызов функции при каждом акте сравнения компрометируют дхегг() с точки зрения ее роли готового блока для построения других библиотек. Почти для любых типов данных легко выполнить сравнение без лишних затрат на вызов функции.
Велики ли эти затраты? В большинстве случаев — нет. Но в то же время, для некоторых алгоритмов затраты на вызов функции могут составить львиную долю от полного времени работы, что заставит пользователя искать альтернативы. Методика предоставления алгоритма сравнения посредством параметра шаблона, описанная в 913.4, решает проблему. Данный пример показывает конкуренцию между эффективностью и универсальностью. От стандартной библиотеки требуется не просто выполнять поставленные перед ней задачи, но делать это достаточно эффективно, чтобы не провоцировать пользователя на реализацию собственных решений. В противном случае, разработчики более продвинутых и специализированных средств просто вынуждены будут обходить стандартную библиотеку стороной, чтобы оставаться конкурентоспособными.
Все это только усложнило бы жизнь и разработчикам библиотек, и их пользователям, желающим оставаться независимыми от конкретной платформы в случае применения нескольких независимых библиотек. Требования «примитивности» и удобства типового использования кажутся взаимоисключающими. Первое требование мешает особой оптимизации стандартной библиотеки для общих случаев.
Однако компоненты для решения общих (часто встречающихся) и непримитивных задач могут быть добавлены к стандартной библиотеке помимо, а не вместо примитивных средств. Культ ортогональности не должен помешать нам сделать жизнь новичка или случайного пользователя стандартной библиотеки простой и удобной. Он не должен заставлять нас мириться с неясным и опасным умолчательным поведением компонентов библиотеки. Глава 16. Организация библиотеки и контейнеры 520 16.1.2. Организация стандартной библиотеки Контейнеры <яесгог> одномерный массив элементов Т ~ 916.3 <гег> 917 2.2 двусвязный список элементов Т ~ <еедие> 9 17.2.3 двусторонняя очередь элементов Т ~ <диене> 917.3.2 очередь элементов Т 917.3.1 ' <маса> <нщу> стек элементов Т ассоциативный массив элементов Т 917.4.1 917.4.3 множество элементов Т <зег> множество булевских переменных 917.5.3 <оттает> Ассоциативные контейнеры итиЫитар и нтнЫтег находятся в файлах <гиар> и <зег>, соответственно.
Контейнер ргтогтгу диене объявляется в <диеие>. Заголовочный файл <итеитогу> также содержит шаблон анто ргг, призванный сгладить взаимодействие указателей и исключений Я14.4.2). Итервторы Глава 19 <Фегатог> итераторы и поддержка итераторов Средства стандартной библиотеки определены в пространстве имен зяб и расположены в некотором наборе заголовочных файлов, реализующих большую часть этих средств. Перечисление этих заголовочных файлов дает представление о стандартной библиотеке и поясняет направление ее рассмотрения в настоящей и последуипцих главах книги.
Ниже в данном разделе мы приводим список заголовочных файлов стандартной библиотеки, сгруппированный по функциональности, и сопровождаемый краткими пояснениями и ссылками на разделы книги, в которых они рассматриваются. Стандартный заголовочный файл, начинающийся на букву с, эквивалентен соответствующему заголовочному файлу стандартной библиотеки языка С. Для каждого файла <Х.й>, определяющего часть стандартной библиотеки языка С в глобальном пространстве имен н в пространстве имен згсг, имеется заголовочный файл <сХ>, определяющий те же имена исключительно в пространстве имен згсг (см. . 99.2.2). 16.1. Проектные решения стандартной библиотеки.