2016-02-04 1 views
2

Я думал, что это прозвучит простой простой вопрос, но я встал на это при чтении спецификации исключения на языке С ++. что в одной из книг C++ 11 теперь имеет ключевое слово «noexcept», что означает, что исключение не будет выбрано из функции, если оно объявлено с заголовком функции, и что причиной появления этого ключевого слова является C++ exception specifications are checked at run time rather than at compile time, so they offer no programmer guarantees that all exceptions have been handled. и, следовательно, они заключают два случая функция, будет бросать исключение или если мы ясно, если он никогда не бросит, а затем использовать noexcept для оптимизации (будем надеяться), какое системное программное обеспечение отвечает за проверку времени выполнения.

void foo() noexcept();

Вот главный вопрос. Какое системное программное обеспечение выполняет проверку времени выполнения (надеюсь, что не компилятор/компоновщик/загрузчик), а также какое системное программное обеспечение отвечает за выделение памяти во время выполнения (распределение динамической памяти), когда все это не заботится компилятором и другими?

+2

http://stackoverflow.com/questions/2766233/what-is-the-c-runtime-library – RyanP

+0

Ryan, является ли ссылка компилятора теми библиотеками времени выполнения после того, как был выполнен перевод? Какой тип связывания произойдет статическим/динам amic (я думаю, только динамический)? –

+0

Если вы используете Visual C++, например, у вас есть возможность указать компилятору (как свойство проекта), следует ли ссылаться на DLL-версию CRT или статически компилировать ее с помощью вашего кода. В первом варианте ваш exe меньше, потому что он загружает DLL во время выполнения (который ваш клиент должен иметь на своем компьютере, Visual Studio Redistributable), а во втором варианте ваш exe больше, потому что он содержит соответствующие функции CRT, но DLL не загружается во время выполнения. – RyanP

ответ

1

Действительно, вы не сказали бы, что эта «стандартная библиотека» справляется с этим. Исключения и спецификации исключений - скорее основная функция языка, более фундаментальная, чем стандартная библиотека.

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

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

Когда вы спросите

и который программная система отвечает за выделение памяти во время выполнения (распределение динамической памяти

это опять деталь реализации, она будет отличаться от компилятора компилятора.

+0

Есть ли какой-нибудь способ, которым я могу получить заметные замечания об этих деталях реализации GCC? –

+0

Я бы не ожидал найти подробную документацию, потому что люди на самом деле не должны полагаться или думать о деталях реализации, и они могут сильно измениться с версии на версию. Есть опросы и таковые из архитектуры gcc, но для действительно конкретных вопросов вы можете попросить gcc-разработчика лично, возможно, на канале irc или что-то (?) Или посмотреть на исходный код ... –

+0

Надейтесь, что разработчики вокруг в SO :) –

2

AFAIK это выполняется средой выполнения C++ (например, libstdC++). В случае исключений есть некоторые охранники, добавленные вокруг функций компилятором (это необходимо, чтобы вызвать деструкторы в случае исключения исключения), а в случае noexcept, если функция выбрасывает (или если она выдает другое исключение, объявленный спецификацией throw()), terminate() вызывается средой выполнения C++ и приложение закрывается.

Выделение кучи памяти также (по умолчанию) выполняется библиотеками времени выполнения C++.

+0

Axalias, все это произошло в библиотеке времени выполнения (кажется, кстати)? Я думал, что библиотеки - это просто утилиты или предварительно написанные скомпилированные подпрограммы, которые будут связаны (статически/динамически) с помощью некоторого программного обеспечения X для его работы Y. какое программное обеспечение обращается к этим библиотекам времени выполнения, компилятор (я имею в виду, что компилятор помещает некоторую информацию для компоновщика по коду)? –

3

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

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

+0

Просто, чтобы прояснить ситуацию, мой вопрос не о Исцелении нетронутым. его о времени выполнения. Я принял исключение, когда я встал с этим вопросом, читая его :). –

2

Обычно ответственное программное обеспечение не является четко идентифицируемым фрагментом кода, а небольшие фрагменты кода, посыпанные исполняемым файлом. Компилятор переводит ваш код в двоичные инструкции, а noexcept не является исключением;).

Смежные вопросы