Использование блоков попытки/выгоды в C++

На основании ответа Эда Байятса:

/// <summary>
/// Turn a string into a CSV cell output
/// </summary>
/// <param name="value">String to output</param>
/// <returns>The CSV cell formatted string</returns>
private string ConvertToCsvCell(string value)
{
    var mustQuote = value.Any(x => x == ',' || x == '\"' || x == '\r' || x == '\n');

    if (!mustQuote)
    {
        return value;
    }

    value = value.Replace("\"", "\"\"");

    return string.Format("\"{0}\"", value);
}
15
задан AJ S. 4 June 2009 в 15:44
поделиться

8 ответов

В C ++ стоимость зависит от реализации. В общем, есть два способа реализовать исключения:

Первый - это «табличный» подход. Компилятор создает набор таблиц для поиска, в точке, где возникло исключение, куда идти. Когда генерируется исключение, он должен искать в каждой таблице вверх по стеку вызовов, пока не найдет то, что перехватит это исключение. Поскольку все это основано на времени выполнения, вход в try catch или выход из него не приводит к штрафу (хорошо), но генерирование исключения связано с потенциально большим количеством поисков, что приводит к гораздо более медленному выбору. Я лично предпочитаю блокировку try catch без необходимости платить, потому что исключения должны быть очень редкими обстоятельствами. Это также увеличило бы размер исполняемых файлов, если бы они должны были хранить таблицы.

Секунды - это "кодовый" подход. Каждый раз, когда код входит в блок try catch, концептуально местоположение блока помещается в стек. Это приводит к затратам при входе в блок try-catch и выходе из него, однако при возникновении исключения механизм времени выполнения может быстро выскочить из стека, чтобы найти, куда идти. Таким образом, создание исключений происходит (намного?) Быстрее, но ввод блока теперь имеет определенную стоимость. Включение блока try catch в плотный цикл низкого уровня может привести к значительным накладным расходам.

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

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

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

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

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

17
ответ дан 1 December 2019 в 02:02
поделиться

Я нашел технический отчет о производительности C ++ (предупреждение в формате PDF), который включает раздел об исключениях. Возможно, вам это будет интересно. У меня были коллеги, которые считали, что на каждую инструкцию в блоке try / catch были накладные расходы, но этот технический отчет, похоже, не поддерживает эту идею.

6
ответ дан 1 December 2019 в 02:02
поделиться

На ваш второй вопрос: общие инструкции здесь , Херб Саттер также дает неплохой совет здесь .

5
ответ дан 1 December 2019 в 02:02
поделиться

Зависит от компилятора. Почему бы вам не написать простую функцию с блоком try-catch и аналогичную функцию без него и не сравнить сгенерированный машинный код?

2
ответ дан 1 December 2019 в 02:02
поделиться

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

http://www.parashift.com/c++-faq-lite/exceptions.html

1
ответ дан 1 December 2019 в 02:02
поделиться

В большинстве языков вход в блок try / catch и выход из него с помощью обычных методов является бесплатным, только при возникновении исключения обработчик исключения ищет, где обработать исключение.

0
ответ дан 1 December 2019 в 02:02
поделиться

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

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

0
ответ дан 1 December 2019 в 02:02
поделиться

В C ++ вам не следует используйте блоки try / catch для выполнения очистки. Вместо этого вы можете использовать шаблоны для получения ресурсов.

auto_ptr - один [плохой] пример

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

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

0
ответ дан 1 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

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