Сколько места делает обработку исключения C++, добавляют

Ваш пример set A="qwerty" && echo %A% неверен. Переменные в приглашении cmd / пакетном файле расширяются один раз для каждой строки / команды:

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && echo %A%
%A%

==> echo %A%
"qwerty"

Почему это происходит?

The [117 ] команда была впервые введена в MS-DOS 2.0 в марте 1983 года, в то время память и процессор были очень ограничены, и было достаточно расширения переменных один раз на строку .

blockquote>

Обходной путь с использованием команды CALL :

==> set "A="

==> echo %A%
%A%

==> set A="qwerty" && CALL echo %A%
"qwerty"

Редактировать:

Для полноты картины следующий пакетный скрипт показывает механизм расширения в процентах и ​​его комбинация с командой CALL подробно (примечание удвоило % знаков процента в пакетном файле CALL Echo %%_var%%):

@ECHO OFF
SETLOCAL
if NOT "%~1"=="" ECHO ON
echo        1st:
Set "_var=first"
Set "_var=second" & Echo %_var% & CALL Echo %%_var%%  
echo        2nd: 
Set "_var=first"
Set "_var=second" & CALL Echo %%_var%% & Echo %_var%  

[1126 ] Выход, echo OFF:

==> D:\bat\SO\55237418.bat
       1st:
first
second
       2nd:
second
first

Выход, echo ON:

==> D:\bat\SO\55237418.bat on

==> echo        1st:
       1st:

==> Set "_var=first"

==> Set "_var=second"   & Echo first   & CALL Echo %_var%
first
second

==> echo        2nd:
       2nd:

==> Set "_var=first"

==> Set "_var=second"   & CALL Echo %_var%   & Echo first
second
first

53
задан WaltK 18 July 2015 в 12:16
поделиться

8 ответов

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

Компилятор C++ GNU использует стоившую за нуль модель по умолчанию т.е. нет никакого времени наверху, когда исключения не происходят.

Так как информация о коде обработки исключений и смещениях локальных объектов может быть вычислена однажды во время компиляции, такая информация может храниться в единственном месте, связанном с каждой функцией, но не в каждом ARI. Вы по существу удаляете исключение наверху от каждого ARI и таким образом избегаете дополнительного времени для продвижения их на стек. Этот подход называют стоившей за нуль моделью обработки исключений, и оптимизированное устройство хранения данных упомянуло, ранее известен как теневой стек. - Bruce Eckel, Думающий в Объеме C++ 2

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

Мое мнение - то, что большинство встроенных систем имеет много памяти до такой степени, что, если Ваша система имеет компилятор C++, у Вас есть достаточно пространства для включения исключений. Компьютер ПК/104, что мое использование проекта имеет несколько ГБ вторичной памяти, 512 МБ оперативной памяти, следовательно без проблем свободного пространства для исключений - хотя, наши микроконтроллеры программируются в C. Моя эвристика, "если существует основной компилятор C++ для нее, используйте исключения, иначе используйте C".

35
ответ дан bias 7 November 2019 в 08:48
поделиться

Измеряя вещи, часть 2. Я теперь получил две программы. Первое находится в C и компилируется с gcc-O2:

#include <stdio.h>
#include <time.h>

#define BIG 1000000

int f( int n ) {
    int r = 0, i = 0;
    for ( i = 0; i < 1000; i++ ) {
        r += i;
        if ( n == BIG - 1 ) {
            return -1;
        }
    }
    return r;
}

int main() { 
    clock_t start = clock();
    int i = 0, z = 0;
    for ( i = 0; i < BIG; i++ ) {
        if ( (z = f(i)) == -1 ) { 
            break;
        }
    }
    double t  = (double)(clock() - start) / CLOCKS_PER_SEC;
    printf( "%f\n", t );
    printf( "%d\n", z );
}

Вторым является C++, с обработкой исключений, скомпилированной с g ++-O2:

#include <stdio.h>
#include <time.h>

#define BIG 1000000

int f( int n ) {
    int r = 0, i = 0;
    for ( i = 0; i < 1000; i++ ) {
        r += i;
        if ( n == BIG - 1 ) {
            throw -1;
        }
    }
    return r;
}

int main() { 
    clock_t start = clock();
    int i = 0, z = 0;
    for ( i = 0; i < BIG; i++ ) {
        try {
         z += f(i); 
        }
        catch( ... ) {
            break;
        }

    }
    double t  = (double)(clock() - start) / CLOCKS_PER_SEC;
    printf( "%f\n", t );
    printf( "%d\n", z );
}

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

Результат: Время выполнения дает версии C край на 0,5% по версии C++ за исключениями, не 10%, что другие говорили о (но не продемонстрировали),

Я был бы очень благодарен, если другие могли бы попытаться компилировать и работать, код (должен только занять несколько минут), чтобы проверить, что я не сделал ужасную и очевидную ошибку нигде. Это - knownas "научный метод"!

20
ответ дан 7 November 2019 в 08:48
поделиться

Я работаю в низкой среде задержки. (sub 300 микросекунд для моего приложения в "цепочке" производства) Обработка исключений, по моему опыту, добавляет 5-25%-е время выполнения в зависимости от суммы, которую Вы делаете!

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

Просто сохраните двоичный файл разумным (зависит от Вашей установки).

Я делаю довольно обширное профилирование своих систем.
Другие противные области:

Вход

При сохранении (мы просто не делаем этого, или если мы, это параллельно),

6
ответ дан Alex 7 November 2019 в 08:48
поделиться

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

У меня нет чисел. Однако для самой встроенной разработки, я видел, что люди выгоняют две вещи (для набора инструментальных средств VxWorks/GCC):

  • Шаблоны
  • RTTI

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

В тех случаях, где мы действительно хотим быть рядом с металлом, setjmp/longjmp используются. Обратите внимание на то, что это не возможное лучшее решение (или очень мощный), вероятно, но затем это - то, что используют _we_.

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

Другая вещь о встроенной разработке: шаблоны избегаются как чумы - они вызывают слишком много чрезмерного увеличения размера. Исключения ходят по пятам шаблоны и RTTI, как объяснил Johann Gerell в комментариях (я предположил, что это было хорошо понято).

Снова, это, что мы делаем. Что это со всем downvoting?

4
ответ дан dirkgently 7 November 2019 в 08:48
поделиться

По-моему, обработка исключений не что-то, что это обычно приемлемо для встроенной разработки.

Ни GCC, ни Microsoft не имеют "служебную нулем" обработку исключений. Оба компилятора вставляют пролог и операторы эпилога в каждую функцию, которые отслеживают объем выполнения. Это приводит к измеримому увеличению производительности и объема потребляемой памяти.

Различие в производительности - что-то как 10%, по моему опыту, которое для моей области работы (графика в реальном времени) является огромной суммой. Память наверху была намного меньше, но все еще значительный - я не могу помнить число бесцеремонно, но с GCC/MSVC легко скомпилировать Вашу программу оба пути и измерить различие.

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

Я также избегал бы RTTI для встроенной разработки, хотя мы действительно используем его в сборках отладки к проверке работоспособности downcasting результаты.

1
ответ дан Tom 7 November 2019 в 08:48
поделиться

Одна вещь рассмотреть: Если Вы работаете во встроенной среде, Вы хотите получить приложение как можно меньше. Время выполнения Microsoft C добавляет довольно мало служебные к программам. Путем удаления времени выполнения C как требования я смог заставить простую программу быть EXE-файлом 2 КБ вместо 70 - что-то файл килобайта, и это со всей оптимизацией для включенного размера.

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

Вы могли бы требовать просто динамично ссылка, но в моем случае, который не был практичен.

Другое беспокойство - то, что для исключений C++ нужно, ограничил RTTI (информация о типах во время выполнения), по крайней мере, о MSVC, что означает, что имена типов Ваших исключений хранятся в исполняемом файле. Мудрый пространством, это не проблема, но это просто 'чувствует' инструмент для очистки мне, чтобы не иметь эту информацию в файле.

4
ответ дан Michael 7 November 2019 в 08:48
поделиться

Легко видеть влияние на двоичный размер, просто выключить RTTI и исключения в Вашем компиляторе. Вы получите жалобы на dynamic_cast <>, если Вы будете использовать его..., но мы обычно избегаем использования кода, который зависит от dynamic_cast <> в наших средах.

Мы всегда находили, что это победа для выключения обработки исключений и RTTI с точки зрения двоичного размера. Я видел много различных методов обработки ошибок в отсутствие обработки исключений. Самое популярное, кажется, передает коды неисправности стек вызовов. В нашем текущем проекте мы используем setjmp/longjmp, но я отговорил бы от этого в проекте C++, поскольку они не выполнят деструкторы при выходе из объема во многих реализациях. Если я честен, я думаю, что это было плохим выбором, сделанным исходными архитекторами кода, особенно полагая, что нашим проектом является C++.

1
ответ дан Dan Olson 7 November 2019 в 08:48
поделиться

Определите 'встроенный'. На 8-разрядном процессоре я, конечно, не не работал бы за исключениями (я не буду, конечно, работать с C++ на 8-разрядном процессоре). Если Вы работаете с платой типа PC104, которая достаточно мощна, чтобы быть чьим-то рабочим столом несколько лет тогда, Вы могли бы выйти сухим из воды. Но я должен спросить - почему там исключения? Обычно во встраиваемых приложениях что-нибудь как появление исключения невероятно - почему та проблема не стала разобранной в тестировании?

Например, это находится в медицинском устройстве? Неаккуратное программное обеспечение в медицинских устройствах уничтожило людей. Недопустимо для чего-либо незапланированного произойти, период. Все виды отказа должны составляться и, как Joel Spolsky сказал, исключения похожи на Операторы перехода кроме Вас, не знают, откуда их называют. Таким образом, когда Вы обрабатываете свое исключение, что перестало работать и в чем состояние является Вашим устройством? Из-за Вашего исключения Ваша машина лучевой терапии, упорно продолженная ПОЛНЫЙ, и готовит кого-то живого (это произошло IRL)? В, какая точка сделала исключение, происходят в Ваших 10,000 + строки кода. Уверенный Вы можете сокращать это к, возможно, 100 строкам кода, но Вы знаете, что значение каждой из тех строк, вызывающих исключение?

Без большей информации, которые, как я сказал бы, НЕ планируют исключения в Вашей встроенной системе. Если Вы добавляете их, затем готовы запланировать виды отказа КАЖДОЙ СТРОКИ КОДА, которая могла бы вызвать исключение. Если Вы делаете медицинское устройство затем, люди умирают, если Вы не делаете. При создании портативного DVD-плеера, ну, в общем, Вы сделали плохой портативный DVD-плеер. Который является этим?

0
ответ дан Stephen Friederichs 7 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: