Много поддерживающей техника необходимо, чтобы писать правильное исключение безопасного кода легко.
Я удивлен тем, что в эту линию не попало больше людей. Это обсуждается «con»: обработка исключений является дорогостоящей. Остальная часть параграфа - это только детали того, почему требуется столько машин.
Это недостаток исключений, которые обычно игнорируются на двухъядерных 2 ГГц машинах с 4 ГБ ОЗУ, 1 ТБ жестким диском и кусками виртуальной памяти для каждого процесса. Если код легче понять, отладить и написать, затем купить/сделать быстрее аппаратное обеспечение и написать узкие места без исключений, а также в C.
Однако в системе с более жесткими ограничениями вы не можете игнорировать накладные расходы. Попробуй это. Сделайте файл test.cpp следующим образом:
//#define USE_EXCEPTIONS
int main() {
int value;
#ifdef USE_EXCEPTIONS
try {
#endif
value++;
#ifdef USE_EXCEPTIONS
if (value != 1) {
throw -1;
}
}
catch (int i) {
return i;
}
#else
return -1;
}
#endif
return value;
}
Как вы можете видеть, этот код почти ничего не делает. Он выполняет приращение статического значения.
Скомпилируйте его в любом случае с
g++ -S -nostdlib test.cpp
и посмотрите на полученный файл сборки test.s. Шахта имела длину 29 строк без блока if (value != 1) { return -1 }
, или 37 строк с примером тестового блока возврата. Большая часть из них была ярлыками для компоновщика.
После того как вы удовлетворены этим кодом, раскомментируйте опцию #define USE_EXCEPTIONS
в верхней части страницы и скомпилируйте ее снова. Wham! 155 строк кода для обработки исключения. Я дам вам, что теперь у нас есть дополнительный оператор return
и конструкция if
, но это всего лишь пара строк.
Это далеко не полный контрольный показатель обработки исключений. Для более авторитетного и тщательного ответа см. Раздел 5.4 ISO/IEC TR18015 Technical Report on C++ Performance. Обратите внимание, что они начинают с почти-как-тривиальным примером:
double f1(int a) { return 1.0/a; }
double f2(int a) { return 2.0/a; }
double f3(int a) { return 3.0/a; }
double g(int x, int y, int z) {
return f1(x) + f2(y) + f3(z);
}
так что есть смысл в использовании абсурдно небольшие тестовые случаев. Существуют также потоки StackOverflow here и here (где я снял вышеуказанную ссылку, любезно предоставил Ксавье Нодет).
Это вспомогательное оборудование, о котором они говорили, и поэтому 8 ГБ оперативной памяти скоро будет стандартным, почему процессоры будут иметь больше ядер и работать быстрее, и почему машина, на которой вы сейчас находитесь, будет непригодной для использования. При кодировании вы должны очистить абстракцию в голове и подумать о том, что действительно делает линия кода. Такие вещи, как обработка исключений, идентификация типа времени выполнения, шаблоны и чудовищный STL, являются дорогостоящими с точки зрения памяти и (в меньшей степени) временем выполнения. Если у вас много памяти и пылающий процессор, тогда не беспокойтесь об этом. Если нет, то будьте осторожны.
Тип дубликата, см. Http://stackoverflow.com/questions/1849490/ –
Одна из проблем руководства по стилю Google заключается в том, что исключения становятся все более распространенными, а не меньше, поэтому код, который не является безопасным, является хрупким. –
http://gotw.ca/gotw/082.htm – DumbCoder