Почему реализация STL такая нечитаемая? Как C ++ мог быть улучшен здесь? - PullRequest
31 голосов
/ 22 сентября 2009

Например, почему большинство членов в реализации STL имеют префикс _M_ или _ или __? Почему так много шаблонного кода?

Какие функции отсутствуют в C ++, которые позволили бы сделать векторную (например) реализацию понятной и более краткой?

Ответы [ 3 ]

37 голосов
/ 22 сентября 2009

Реализации используют имена, начинающиеся со знака подчеркивания, за которым следует заглавная буква или два знака подчеркивания, чтобы избежать конфликтов с пользовательскими макросами. Такие имена зарезервированы в C ++. Например, можно определить макрос с именем Type, а затем #include <vector>. Если бы vector реализации использовали Type в качестве имени параметра шаблона, оно сломалось бы. Однако нельзя определять макросы, называемые _Type (или __type, type__ и т. Д.). Поэтому vector может смело использовать такие имена.

6 голосов
/ 22 сентября 2009

Множество реализаций STL также включают проверку отладочных сборок, например, проверку, что два итератора находятся в одном контейнере при их сравнении, и наблюдение за выходом итераторов за пределы. Это включает в себя довольно сложный код для отслеживания контейнера и достоверности каждого созданного итератора, но он неоценим для поиска ошибок. Этот код также все переплетен со стандартным кодом выпуска с #ifdefs - даже в алгоритмах STL. Так что это никогда не будет таким ясным, как их основная работа. Сайты, такие как , этот демонстрируют основную функциональность алгоритмов STL, заявляя, что их функциональность "эквивалентна" коду, который они показывают. Вы не увидите этого в заголовочных файлах.

2 голосов
/ 15 ноября 2010

В дополнение к веским причинам, которые уже привели Робсон и AshleysBrain, одна из причин того, что реализации стандартной библиотеки C ++ имеют такие краткие имена и компактный код, состоит в том, что практически каждая программа C ++ (в действительности, модуль компиляции) включает в себя большое количество стандартной библиотеки. заголовки, и, следовательно, они многократно перекомпилируются (помните, что они в основном встроены и основаны на шаблонах, тогда как заголовки стандартной библиотеки C содержат только несколько объявлений функций). Стандартная библиотека, написанная в соответствии со стандартами стиля «отраслевого стандарта», займет больше времени для компиляции и, таким образом, приведет к восприятию того, что определенный компилятор «медленный». Минимизируя пробелы и используя короткие имена идентификаторов, лексеру и анализатору остается меньше работы, и весь процесс компиляции завершается немного быстрее.

Еще одна причина, заслуживающая упоминания, заключается в том, что многие реализации стандартных библиотек (например, Dinkumware, Rogue Wave (старые) и т. Д.) Могут использоваться с несколькими различными компиляторами с совершенно разными стандартами соответствия и изюминками. Зачастую существует множество макропрограмм, направленных на удовлетворение каждой поддерживаемой платформы.

...