|
Программирование >> Обобщенные обратные вызовы
в конце концов, смешно говорить об исчерпании памяти при попытке выделения блока размером 2 Гбайт, в то время, как в системе остается доступным 1 Гбайт памяти! * Еще один случай, когда восстановление после сбоя оператора new имеет смысл, - это когда ваша программа оптимистично пытается выделить огромный рабочий буфер, но при невозможности снижает свои требования до тех пор, пока не сможет получить требуемое. В этом случае программа должна быть создана таким образом, чтобы уметь подстраиваться под имеющийся буфер памяти, а при необходимости и работать с несколькими не последоватсльными блоками памяти. Резюме Избегайте использования не генерирующего исключения оператора new, поскольку он не дает никаких дополнительных преимуществ, зато обычно приводит к худшему поведению программы при ошибке выделения памяти, чем обычный оператор new, генерирующий исключения. Помните, что проверка неуспешного выполнения оператора new зачастую бесполезна по ряду причин. Если же вы действительно беспокоитесь о возможном исчерпании памяти, то убедитесь, что вы проверяете именно то, что намерены, поскольку: проверка отказов оператора new обычно бесполезна в операционной системе, в которой реальное предоставление памяти процессу не происходит до тех пор, пока память не начинает реально использоваться; в системе виртуальной памяти задолго до исчерпания памяти резко снижается производительность программ, что приводит к вмешательству со стороны системного администратора; за исключением некоторых специальных случаев, даже обнаружив отказ оператора new, вы можете мало что сделать для обработки этой ситуации - если памяти в системе действительно не осталось. Интересно, что выделение буфера памяти, размер которого определяется извне, - классический пример уязвимости системы защиты. Атака злонамеренными пользователями или программами, пытающимися вызвать проблемы с буфером динамической памяти, - классика жанра, которая до сих пор остается любимым средством пля взлома (или слома) систем. Заметим, что крах программы, вызванный отказом в выделении блока памяти требуемого размера, - разновидность атаки DOS (Denial-Of-Service - отказ в обслуживании), но не взлома системы в целях получения несанкционированного доступа к ней. Близкая к этому, но отличная методика, связанная с переполнением буфера, также остается излюбленным методом у хакеров, и остается только удивляться, как много программистов все еще продолжают использовать функции типа strcpy и другие, которые не проверяют размеры буфера и оставляют широкий простор для взломщиков. Оптимизация и эффективность Зачастую нам требуется сделать более эффективной ту или иную часть нашей профаммы, и имеется масса вариантов оптимизаций, которые могут помочь нам в этом. Время от времени появляются предположения, что использование ключевого слова const помогает компилятору при выполнении оптимизации кода. Так ли это на самом деле? Почему? Помимо const, множество программистов для повышения эффективности кода часто используют другое ключевое слово - inline. Влияет ли это слово на производительность профамм? Если да, то когда и каким образом? Когда может быть выполнено встраивание кода функции, как под контролем профаммиста, так и без него? И наконец, мы завершим этот раздел примером того, как знания предметной области помогают при разработке приложения с высокой производительностью, которой невозможно достичь никакими низкоуровневыми оптимизациями, играми с битами и другими подобными способами улучшения кода. Задача 24. Константная оптимизация Сложность: 3 Помогает ли корректное применение ключевого слова const компилятору при оптимизации кода? Обычная реакция программиста на этот вопрос: Да, конечно! Не будем спешить... Вопрос для новичка 1. Рассмотрим следующий исходный текст. const Y& f( const Х& X ) { ... некоторые действия с х и поиск объекта Y ... return somev; Помогает ли объявление параметра и/или возвращаемого значения с использованием const компилятору сгенерировать более оптимальный код или улучшить его каким-то иным образом? Обоснуйте ваш ответ. Вопрос для профессионала 2. Поясните, может ли в общем случае наличие или отсутствие ключевого слова const помочь компилятору улучшить генерируемый им код и почему. 3. Рассмотрим следующий исходный текст. void f( const Z 2 ) { ... Ответьте на следующие вопросы. а) При каких условиях и для каких видов классов z .это конкретное указание const может помочь сгенерировать другой, лучший код? б) Говорим ли мы об оптимизации компилятором или о некотором другом типе оптимизации при условиях, рассмотренных в пункте я)? Поясните свой ответ. в) В чем состоит лучший путь достижения того же эффекта? Решение const: ненавязчивый сервис 1. Рассмотрим следующий исходный текст. Пример 24-1 const Y& fС const Х& X ) { ... некоторые действия с х и поиск объекта Y ... return somev; Помогает ли объявление параметра и/или возвращаемого значения с использованием const компилятору сгенерировать более оптимальный код или улучшить его каким-то иным образом? Коротко говоря - нет, вряд ли. Обоснуйте ваш ответ. Что же именно компилятор может улучшить? Может ли он избежать копирования аргумента или возвращаемого значения? Ист. поскольку аргумент уже передается по
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |