Почему стандартная библиотека C++ импортируется как один модуль, а не как несколько модулей меньшего размера?

Если бы я хотел использовать, например, только std::string, не был бы импорт (теоретического) std::string модуля более производительным, чем импорт всей стандартной библиотеки?

Это для простоты использования, поскольку вам придется самостоятельно создавать стандартный библиотечный модуль, а встраивание каждого отдельного компонента в модуль будет утомительным?

Или это связано с какими-то накладными расходами при создании модуля (любого размера), где, если вы импортируете достаточно меньших модулей, это в конечном итоге будет дороже, чем просто импорт одного большого?

В целом разница в скорости должна быть незначительной. Примечание: это просто объявление (и предварительно проанализированное, поэтому больше нет #include, который читает много файлов и требует большого количества анализа). Речь идет не о связывании и добавлении кода в конечную программу.

Giacomo Catenazzi 28.06.2024 11:39

std::string используйте std::allocator, например. размещение нового оператора означает, что вам понадобится вся стандартная библиотека C++. Вы можете связать его статически, чтобы окончательный исполняемый файл содержал только функции, которые он действительно использует, в любом случае это не рекомендуется. Разделение стандартной библиотеки C++ на наименьшие модули является предложением стандарта C++ 25.

Victor Gubin 28.06.2024 11:50

Оказывается, import std; на самом деле быстрее, чем одиночный #include! Насколько я понимаю, компилятор не загружает все в память, а только «каталог», чтобы найти части, которые вы можете использовать позже.

BoP 28.06.2024 11:51

Это явно заговор людей <bits/stdc++.h>

Botje 28.06.2024 11:54

А еще комитет мог бы согласиться, что import std; следует импортировать все. У них не было времени договориться о том, какие именно модули меньшего размера мы хотели бы использовать. Возможно, позже...

BoP 28.06.2024 11:55

Все, что вы видите, это то, что стандарт развивается, а некоторые его части находятся в стадии разработки. Стандартная библиотека C++ через #include допускала включение подмножеств начиная с (ранее) C++98. Модули — относительно новая функция, и работа над разрешением импорта подмножеств стандартной библиотеки находится в стадии разработки. Процесс стандартизации для добавления/изменения/удаления частей стандарта не происходит по щелчку пальцев – это обязательный процесс, который начинается с предложения, рассмотрения и развития этого предложения, включения в проект стандарта и, в конечном итоге, ратификация.

Peter 28.06.2024 12:03

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

prapin 28.06.2024 14:05

ОП, твой вопрос какой-то расплывчатый. Было бы хорошо увидеть два разных оператора импорта/включения, которые вы сравниваете, вместо того, чтобы просто говорить о них в абстрактных терминах.

David Grayson 28.06.2024 21:35

@DavidGrayson Я имею в виду только один тип оператора импорта - import. Я сравнивал import std; и гипотетический import std.string;.

jwick 28.06.2024 22:59

Долгое время MSVC опережал gcc и clang в реализации модулей. Не уверен, что это все еще так. Что касается import std;, Microsoft говорит следующее: «Теперь можно импортировать стандартную библиотеку как модуль, а не как набор файлов заголовков. Это намного быстрее и надежнее, чем включение файлов заголовков, модулей заголовков или предварительно скомпилированных заголовков (PCH )" [Выделено нами.]

tbxfreeware 29.06.2024 12:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
182
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласно новому стандарту вам просто нужно импортировать std. Но это не означает, что в ваш двоичный файл будет добавлен весь STL. Ваш компилятор должен оптимизировать его и «обрезать» все бесполезные ссылки.

Ответ принят как подходящий

Если бы я хотел использовать, например, только std::string, не был бы импорт (теоретического) модуля std::string более производительным, чем импорт всей стандартной библиотеки?

Модули работают не так. Импорт модуля не похож на включение заголовка. Стоимость импорта модуля не пропорциональна количеству содержимого в этом модуле.

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

Есть ли ссылка на это конкретное поведение?

Passer By 28.06.2024 18:33

@PasserBy: ссылка в стандарте? Стандарт диктует видимое поведение, а не производительность. Так что это выходит за рамки стандарта. Однако в предложении поместить все в один модуль было упомянуто, что именно так реализуется импорт модулей, и что они протестировали его на нескольких реализациях и не заметили заметной потери производительности.

Nicol Bolas 28.06.2024 18:38

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

Passer By 28.06.2024 18:45

Другие вопросы по теме