В чем разница между реализациями стандартной библиотеки на C++?

Я, наверное, «на лесной дороге», как мы, немцы, говорим. (Пословица для того, чтобы пойти неправильным путем)

C++ определяет стандартную библиотеку, и этот стандарт часто обновляется в C++98, C++11, C+17 (поправьте меня, если я ошибаюсь). Я бы предположил, что каждый компилятор или ОС определяет собственную реализацию этой стандартной библиотеки.

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

Существуют ли «варианты» реализации для одной и той же ОС? И если да, то когда я захочу беспокоиться о том, какая реализация используется?


person FirefoxMetzger    schedule 03.09.2016    source источник
comment
Я думаю, что было небольшое расширение до 11 в 14, хотя я не должен утверждать, что много знаю об этом.   -  person mathreadler    schedule 03.09.2016


Ответы (2)


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

Пример из §21.4.2:

basic_string(const basic_string& str,
               size_type pos, size_type n = npos,
               const Allocator& a = Allocator()); 

Требуется: pos <= str.size()

Выдает: out_of_range, если pos > str.size().

Эффекты: создает объект класса basic_string и определяет эффективную длину rlen начального строкового значения как наименьшее из n и str.size() - pos, как указано в таблице 65.

Как видите, в стандарте также указано, что делает конструктор std::basic_string, но не указано, как это должно быть реализовано. Он также определяет подпись, которую следует использовать. Фактическая реализация у разных производителей компиляторов различается: gcc и clang имеют разные реализации, хотя и предназначены для одной и той же платформы, но конструктор делает одно и то же.

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

person Rakete1111    schedule 03.09.2016
comment
Мелкие детали реализации очень важны, если учитывать производительность. Не так много, если рассматривать только функцию. - person Paul Draper; 04.09.2016

Что ж, слово стандарт имеет определенное значение, не так ли?

Дело в том, что если все стандартно, то каждая реализация должна отражать этот стандарт.

Другими словами: беспокойтесь не о стандартах, а о тех вещах, которые точно не указаны, например здесь например.

Кроме того, это очень обширная тема. Я думаю, вам следует сузить более конкретные вопросы/области.

Редактировать — причины, по которым различные группы создают свои реализации:

  1. В отличие, например, от Java, здесь нет реализации «золотых стандартов».
  2. Разработчики компиляторов могут захотеть точно настроить библиотеки для своего продукта (и это может быть только о юридических/лицензионных темах).
person GhostCat    schedule 03.09.2016
comment
Но есть такие вещи, как Dinkumware C++ standard library, Apache C++ Standard Library или GNU C++ Library. Поэтому они все просто подумали: «Эй, это круто, давайте все реализуем одно и то же». Или они все для разных операционных систем? - person FirefoxMetzger; 03.09.2016
comment
@FirefoxMetzger, для начала, его частям нужен код, специфичный для компилятора. - person chris; 03.09.2016
comment
@FirefoxMetzger Стандарт не предписывает, как реализовать конкретный контейнер или функцию, он только требует, чтобы семантика этого класса/метода оставалась согласованной во всех системах. В некоторых случаях это строго установлено стандартом, а в других нет, примером последнего может быть std::vector::shrink_to_fit, где то, делает ли метод что-либо или нет, полностью зависит от реализации - это необязательный запрос. - person sjrowlinson; 03.09.2016
comment
@FirefoxMetzger: С таким же успехом можно спросить, почему в разных домах кухни разной формы, с разным цветом столешниц и духовками разных марок. Все они позволяют вам готовить еду, верно? Несмотря на то, что ее конечная функция является стандартной, кухня все же должна вписываться в остальную часть дома. - person Lightness Races in Orbit; 04.09.2016
comment
@FirefoxMetzger: Иногда да, это позволяет всем реализовывать одни и те же интерфейсы. А иногда мне не нравится реализация, которую я использовал, поэтому я делаю ту, которую считаю лучшей. Все различия достаточно тонкие, чтобы вам никогда не приходилось о них беспокоиться. - person Mooing Duck; 04.09.2016