Встроенный C ++: использовать исключения или нет? - PullRequest
38 голосов
/ 09 февраля 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

19 голосов
/ 09 февраля 2010

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

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

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

Взгляните на Рэймонда Чена. Более чистый, элегантный и трудный для распознавания . Он говорит это лучше, чем я мог.

10 голосов
/ 09 февраля 2010

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

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

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

9 голосов
/ 09 февраля 2010

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

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

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

Если, с другой стороны, ваша проблема не поддается централизованной обработке ошибок, тогда исключения являются КОРОЛЕВСКОЙ болью, потому что попытка выяснить, где что-то обрабатывается (или должно быть), может легко стать сизифовой задачей. И действительно трудно увидеть проблему, просто взглянув на код. Вместо этого вам нужно посмотреть на деревья вызовов для данной функции и увидеть, где будут заканчиваться исключения этой функции, чтобы выяснить, есть ли у вас проблемы.

4 голосов
/ 09 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...