Встраиваемый С++: использовать исключения или нет?

Я понимаю, что это может быть субъективным, поэтому зададим конкретный вопрос, но сначала: background:

Я всегда был инженером встроенного программного обеспечения, но обычно на уровне 3 или 2 стека OSI. Я на самом деле не парень. Я вообще всегда делал телекоммуникационные продукты, обычно ручные/сотовые телефоны, что обычно означает нечто вроде процессора ARM 7.

Теперь я нахожусь в более общем встроенном мире, в небольшом запуске, где я могу перейти к "не очень мощным" процессорам (там есть субъективный бит) - я не могу предсказать, какой из них.

Я довольно много читал о дебатах об обработке исключений на С++ во встроенных системах, и нет четкого ответа. Есть несколько небольших забот о переносимости и несколько о времени выполнения, но в основном это похоже на размер кода (или я читаю неправильные дебаты?).

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

Это может показаться "как долго является частью строки", но кто-то может ответить "если ваш кусок строки равен 8051, тогда нет. Если OTOH, это...".

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

Ответ 1

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

Так что, если ваша единственная забота - это производительность, я бы сказал, не беспокойтесь позже. Если сегодня процессор справится с этим, то и завтра тоже.

Тем не мение. По моему мнению, исключения являются одной из тех функций, которые требуют от программистов умнее, чем можно ожидать от программистов. Поэтому я говорю - если вы можете держаться подальше от кода, основанного на исключениях. Держись подальше.

Посмотрите на Raymond Chen Cleaner, более элегантный и трудный для распознавания. Он говорит это лучше, чем я мог.

Ответ 2

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

Второе (возможно) увеличение двоичного размера.

Я бы предложил вам читать Технический отчет о производительности С++, в котором конкретно рассматриваются темы, которые вас интересуют: использование С++ во встроенных (включая жесткие системы реального времени) и как обычно выполняется обработка исключений и какие служебные данные имеют.

Ответ 3

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

Я использовал исключения С++ широко, как в дооснащении старым C-кодом, так и в каком-то более новом коде. (СОВЕТ. Не пытайтесь переустанавливать 20-летний код C, написанный в среде с низкой памятью, с любыми непоследовательными исключениями. Это просто кошмар).

Если ваша проблема заключается в том, что она обрабатывает все ошибки в одном месте (например, TCP/IP-сервер какого-либо типа, где каждое условие ошибки встречается с "сломать соединение и повторить попытку" ), тогда исключения хороши - вы можете просто выбросить исключение где угодно, и вы знаете, где и как это будет обрабатываться.

Если, с другой стороны, ваша проблема не поддается центральной обработке ошибок, тогда исключения - это БОЛЬШАЯ боль, потому что попытка выяснить, где что-то (или должна) быть обработана, может легко стать задачей Sisyphean. И это действительно трудно увидеть проблему, просто взглянув на код. Вместо этого вы должны посмотреть на деревья вызовов для данной функции и посмотреть, где будут заканчиваться исключения этой функции, чтобы выяснить, есть ли у вас проблема.

Ответ 4

Я бы сказал, что используйте исключения, если среда выполнения поддерживает их. Исключения для обработки чрезвычайных условий являются точными и могут вызвать небольшие накладные расходы в зависимости от реализации. Некоторые среды не поддерживают их, особенно во встроенном мире. Если вы их запретите, будьте осторожны, чтобы объяснить, почему. У меня когда-то был парень, который, когда ему сказали не использовать исключения, вместо этого сделал деление на ноль. Не совсем то, что мы имели в виду.