Обзор среды выполнения C++

Среда выполнения C++ развилась в течение разработки OS X. В то время как последняя версия поставлена как динамическая совместно используемая библиотека, ранние версии библиотеки были поставлены как статический архивный файл. Следующее является сводкой истории времени выполнения:

Следующие разделы обеспечивают более подробную информацию о динамических и статических временах выполнения C++. Дополнительный раздел предоставляет информацию о проверке номеров версий времени выполнения.

Предназначение для OS X v10.3.8 и Ранее

В OS X v10.3.8 и ранее, стандартная библиотека C++ упаковывается как статический архивный файл libstdc++.a. Эта библиотека разработана с многократными клиентами в памяти и обеспечивает синхронизацию потоков I/O, а также скрытых символов для улучшения конфликтов пространства имен. Символы в библиотеке отмечены __private_extern__ препятствовать тому, чтобы они были экспортированы в другие модули кода. Версии этой библиотеки доступны во всех версиях OS X, но программы должны быть созданы с помощью компилятора GCC 3.3.

Предназначение для OS X v10.3.9 и Позже

В OS X v10.3.9 и позже, у Вас есть опция соединения против статической или динамической версии времени выполнения C++.

Статическое время выполнения C++

С введением Инструментов XCode 2.3, новая версия стандартной библиотеки C++ сделана доступной в статическом архивном файле libstdc++-static.a. Эта новая статическая библиотека ближе в природе к динамической совместно используемой библиотеке, представленной в OS X v10.3.9, чем к предыдущей статической библиотеке. Это приспосабливает C++ Itanium ABI и требует использования GCC 4.0 для компиляции. Программы, соединяющиеся с библиотекой, должны работать в OS X v10.3.9 или позже. Для получения дополнительной информации посмотрите Развертывание С Новым Статическим Временем выполнения.

Динамическое время выполнения C++

В OS X v10.3.9 и позже, время выполнения C++ доступно как динамическая совместно используемая библиотека libstdc++.dylib. Это изменение в упаковке приносит время выполнения C++ в соответствии со временем выполнения C, всегда упаковывавшимся как часть динамической совместно используемой библиотеки libSystem.dylib. Динамическая библиотека приспосабливает C++ Itanium ABI, который является стандартом для скомпилированного кода C++, обеспечивающего лучшую совместимость ссылки между двоичными файлами C++. Поскольку это совместно используется, ограничения пространства имен дарят статические версии библиотеки, не стали, и символы больше не отмечаются __private_extern__. Для получения информации о разработке и пользовании основанными на С++ динамическими библиотеками, посмотрите, что Динамическая Библиотека Программирует Темы.

Преимущества совместно используемого времени выполнения C++

При упаковке стандартной библиотеки C++, поскольку динамическая совместно используемая библиотека важна для обеспечения производительности и правильности программы. Если Ваша исполнимая программа соединяется с libstdc++.a и к нескольким динамическим совместно используемым библиотекам, и один или большему количеству тех совместно используемых библиотек также соединяется с libstdc++.a, тогда многократные копии библиотеки загружаются в память во время выполнения.

Для правильности все компоненты программы должны использовать ту же самую копию стандартной библиотеки C++. Причина состоит в том, что некоторые данные во время выполнения C++ должны быть совместно использованы всеми компонентами, или могут произойти неожиданные результаты. Например, если два компонента оба используют C++ механизм I/O для записи в стандартный вывод, результаты могут стать искаженными, если они используют различные буферы.

Для производительности наличие многократных копий той же библиотеки приводит к увеличенной активности диска, как каждая копия читается в память. Дополнительные копии могут также привести к увеличенной разбивке на страницы и неудачным обращениям в кэш вследствие увеличенного объема потребляемой памяти приложения. Устранение дублированных библиотек может сократить место Вашего приложения существенно. Например, считайте следующий “привет мировой” программой скомпилированный с libstdc++.a и GCC 3.3:

int main ()
{
    std::cout << "Hello, World!\n" << std::endl;
    return 0;
}

Размер получающегося двоичного файла на OS X v10.4 система составляет 650 КБ. Та же программа, скомпилированная в той же системе с помощью GCC 4.0 и libstdc++.dylib 17 КБ.

Совместимость на уровне двоичных кодов

GCC 4.0 приспосабливает C++ Itanium ABI, который является стандартом для скомпилированного кода C++. Спецификации для этого стандарта сохраняются консорциумом разных производителей и охватывают проблемы, такие как искажение имени, задействованное расположение класса, виртуальные протоколы вызова метода, обработка исключений и информация о типах во время выполнения (RTTI) форматы. Можно найти последнюю версию этой спецификации в http://www .codesourcery.com/cxx-abi/abi.html.

Поскольку GCC 4.0 приспосабливает C++ Itanium ABI, объекты C++ совместимы со ссылкой с объектами, созданными другими компиляторами OS X, соответствующими этой спецификации. Apple гарантирует, что будущие выпуски GCC для OS X также приспособят C++ Itanium ABI. Это означает, что разработчики могут безопасно поставить динамические совместно используемые библиотеки, интерфейсы которых включают классы C++, хотя с некоторыми протестами:

  • Apple гарантирует устойчивость ABI только для функций базового языка. Это не гарантирует устойчивости для классов библиотеки, включая std::string, std::map<T>, и std::ostream среди других.

  • Apple не гарантирует совместимости на уровне двоичных кодов между различными основными версиями libstdc++. GCC 4.0 поставляет с версией 6.0.3 библиотеки. Если новая основная версия (версия 7.0.0) будет выпущена в будущем, то та библиотека, как гарантируют, не будет совместима с 6.x версии.

  • Совместимость на уровне двоичных кодов между различными версиями сторонней динамической совместно используемой библиотеки также зависит от проекта библиотеки, не только на поддержке компилятора стандартного ABI. Необходимо гарантировать, чтобы Вы не представляли проблемы совместимости.

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

Для получения дополнительной информации о совместимости на уровне двоичных кодов посмотрите Создающие Совместимые Библиотеки.

Проверка номеров версий

Традиционно, XCode поставил с соответствием версий компилятора GCC и время выполнения C++. Однако Xcode 3.0 порвал с этой традицией путем поставки версии 4.2 GCC с версией 4.0 времени выполнения. Вы, возможно, должны проверить на эту конфигурацию для записи переносимого кода. Макросы компилятора __GNUC__ и __GNUC_MINOR__ определяются как номера основной версии и номера вспомогательной версии самого компилятора. В SDKs, включенном в Xcode 3.2 и позже, макросы __GNUC_LIBSTD__ и __GNUC_LIBSTD_MINOR__ определяются как номера основной версии и номера вспомогательной версии времени выполнения. Все четыре макросов определяются во время компиляции только, не во время выполнения.

Следующий пример показывает, как использовать макросы для проверки версии времени выполнения C++:

#if (__GNUC_LIBSTD__ > 4) || ((__GNUC_LIBSTD__ == 4) && (__GNUC_LIBSTD_MINOR__ >= 2))
#include <ext/atomicity.h>
#else
#include <bits/atomicity.h>
#endif