Есть ли "магия" в STL?

Позвольте мне начать с объяснения того, что я имею в виду под "магией". Я буду использовать два примера из Java:

  • Каждый класс наследует (прямо или косвенно) класс Object.
  • Перегрузка оператора не поддерживается Java, но оператор + определен для объектов String.

Это означает, что невозможно реализовать реализацию классов Object и String в чистой (*) Java. Теперь это то, что я имею в виду под "магией": для реализации этих классов вам понадобится специальная поддержка от компилятора.

Что мне всегда нравилось в С++, так это то, что, насколько мне известно, в STL нет такой "магии", т.е. можно реализовать STL в чистом С++.

Теперь мой вопрос: это правда? Или есть части STL, которые не могут быть реализованы в чистом С++ и нуждаются в некоторой "волшебной" /специальной поддержке компилятора?


(*) С "чистым" я имею в виду без использования каких-либо библиотек классов.

Ответ 1

Другими словами, что-либо было сделано для компилятора, чтобы разрешить "специальный случай", который должен был работать STL?

Нет.

Все это было реализовано как "чистый" код на С++, используя магию шаблонов.

Проделана некоторая работа с компиляторами, чтобы улучшить STL (я думаю о различных оптимизациях), но в противном случае нет, вы могли бы написать весь STL, если хотите. Некоторые люди сделали - STLPort - это реализация, которая не имела поддержки какого-либо производителя компилятора.

Ответ 2

Как правильно сказано gbjbaanb, STL может быть реализован на простом С++, не полагаясь на какой-либо компилятор "magic".

Однако, если вы перейдете в исходный код STL для своего компилятора, вы, вероятно, увидите код, который либо не является стандартным, либо который вы не должны писать сами.

STL может быть полностью реализован в стандартном С++, но это не значит, что авторам компилятора не разрешается иногда его улучшать, используя расширения для компилятора. Например, они могут вставлять нестандартный код, который обеспечивает лучшие сообщения об ошибках или, возможно, работает с некоторыми недостатками в их компиляторе или, возможно, включает специальные оптимизации, используя дополнительные функции этого конкретного компилятора.

Они также последовательно используют имена, которые вам запрещено использовать. Например, параметры шаблона обычно называются как _Type, которые, начиная с символа подчеркивания, за которым следует большая буква, зарезервированы для реализации. Стандартной библиотеке разрешено использовать их, но мы с вами нет. Поэтому, если вы собираетесь написать свою собственную реализацию STL, вам придется внести небольшие изменения, но это не из-за какой-либо магии, а просто для того, чтобы избежать столкновений имен между стандартной библиотекой и кодом пользователя.

Ответ 3

Как говорили другие, STL реализуется в чистом стандартном С++ 98. Что не было сказано, так это то, что разработка STL была параллельна разработке механизма шаблонов С++ и в значительной степени приводила к включению определенных функций. Я считаю, что "Поиск зависимых аргументов" (ADL, aka Koenig Lookup), параметры шаблона шаблона и аргументы шаблона по умолчанию все пришли на С++, чтобы служить Степанову STL развитие.

Итак, с STL, они перенесли магию на сам язык. Приятно, что комитет по стандартам признал, что если эти функции были полезны для того, что станет стандартной библиотекой, они могут быть полезны и для всех нас!

Ответ 4

Если по STL вы имеете в виду только часть шаблона стандартной библиотеки С++, то вполне возможно реализовать ее без какой-либо "магии". Независимо от того, использует ли каждая конкретная реализация какое-либо "волшебство", другой вопрос (есть части STL, где "магия" могла бы помочь, но не обязательно).

Теперь, если вы говорите о всей стандартной библиотеке С++, у нее действительно есть немного "магии". Классическим примером могут быть реализованные в библиотеке реализации ::operator new и ::operator delete. Мы часто называем их "перегружаемыми" на обычном языке, тогда как формально они являются сменными. Язык С++ не предоставляет пользователям такую ​​функциональность. Пользователь не может записать сменную функцию.

Другим примером может быть макрос offsetof (унаследованный от стандартной библиотеки C). Хотя он обычно реализуется в "чистом C", популярная реализация на самом деле незаконна с педантичной точки зрения (вызывает поведение undefined). Я не видел формально правовых реализаций offsetof, поэтому я не уверен, что они даже возможны.

Другим примером может быть (опять же, унаследовано от C) макросы для работы с переменными аргументами. Очевидно, что они не могут быть реализованы в чистом C или С++.

Ответ 5

Я уверен, что некоторые type_traits требуют магии компилятора, например has_trivial_constructor, has_virtual_destructor или is_pod.

Ответ 6

std::initializer_list нуждается в поддержке компилятора и не может быть переопределена как другой класс (насколько я знаю), хотя я не уверен, что он подсчитывает, так как он в С++ 0x.

Ответ 7

С++ 0x собирается стандартизировать некоторые де-факто "магические" черты типов.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2984.htm

"Дополнительные типы типов для С++ 0x"

Это содержит несколько замечаний, таких как "XXXX, как полагают, требует поддержки компилятора".

См. также

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Type-Traits.html#Type-Traits

http://msdn.microsoft.com/en-us/library/ms177194(v=vs.80).aspx

Ответ 8

Как правильно сказал gbjbaanb, в реализации STL нет магии. Он написан на чистом С++. Вы могли бы реализовать его самостоятельно, но были легко доступны в виде библиотеки, чтобы сделать вашу жизнь проще.

Ответ 9

Стандарт STL (стандартная библиотека шаблонов). Стандарт определяет требования к реализациям STL. С точки зрения использования нет "волшебства", никаких особых зависимостей, о которых вы должны заботиться. Он может использоваться на любых крупных компиляторах С++ на всех платформах, поддерживаемых этими компиляторами.