Есть ли в STL «магия»? [закрыто]

47
задан Job 29 August 2010 в 15:06
поделиться

7 ответов

другими словами, было ли сделано что-нибудь с компилятором, чтобы учесть «особый случай», необходимый для работы STL?

Нет.

Все это было реализовано как «чистый» код C++ с использованием магии шаблонов.

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

52
ответ дан 26 November 2019 в 19:16
поделиться

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

2
ответ дан 26 November 2019 в 19:16
поделиться

Как правильно сказал gbjbaanb, STL можно реализовать на простом C++, не полагаясь на какую-либо "магию" компилятора.

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

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

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

40
ответ дан 26 November 2019 в 19:16
поделиться

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

-2
ответ дан 26 November 2019 в 19:16
поделиться

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

10
ответ дан 26 November 2019 в 19:16
поделиться

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

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

15
ответ дан 26 November 2019 в 19:16
поделиться

Если под STL вы подразумеваете только шаблонную часть стандартной библиотеки C++, то вполне возможно реализовать ее без какой-либо "волшебной палочки". Использует ли каждая данная реализация какое-либо «волшебство» на самом деле — это другой вопрос (есть части STL, где «волшебство» может помочь, но не обязательно).

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

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

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

14
ответ дан 26 November 2019 в 19:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: