|
||||
|
Приложение А За пределами «Эффективного использования C++» В книгу «Эффективное использование C++» вошло то, что я считаю наиболее важными рекомендациями для практикующих программистов на C++. Если вы интересуетесь дополнительными возможностями повысить эффективность своей работы, я рекомендую ознакомиться с другими моими книгами: «Наиболее эффективное использование C++» и «Эффективное использование STL». В книгу «Наиболее эффективное использование C++» включены дополнительные рекомендации и подробно рассмотрены такие темы, как эффективность и программирование с учетом исключений. Кроме того, в ней описываются такие важные приемы программирования на C++, как «интеллектуальные» указатели, подсчет ссылок и прокси-объекты. «Эффективное использование STL» – это тоже набор рекомендаций, организованный подобно «Эффективному использованию C++», но основное внимание в ней уделено применению стандартной библиотеки шаблонов. Содержание обеих книг приведено ниже. Наиболее эффективное использование C++Основы Параграф 1: Различайте указатели и ссылки Параграф 2: Предпочитайте приведение типов в стиле C++ Параграф 3: Никогда не используйте полиморфизм в массивах Параграф 4: Избегайте неоправданных конструкторов по умолчанию Операторы Параграф 5: Опасайтесь определяемых пользователем функций преобразования типов Параграф 6: Различайте префиксную и постфиксную формы операторов инкремента и декремента Параграф 7: Никогда не перегружайте «&&», «||» или «,» Параграф 8: Различайте значение операторов new и delete Исключения Параграф 9: Чтобы избежать утечки ресурсов, используйте деструкторы Параграф 10: Не допускайте утечки ресурсов в конструкторах Параграф 11: Не распространяйте обработку исключений за пределы деструктора Параграф 12: Отличайте генерацию исключения от передачи параметра или вызова виртуальной функции Параграф 13: Перехватывайте исключения, передаваемые по ссылке Параграф 14: Разумно используйте спецификации исключений Параграф 15: Оценивайте затраты на обработку исключений Эффективность Параграф 16: Не забывайте о правиле «80–20» Параграф 17: Используйте отложенные вычисления Параграф 18: Снижайте затраты на ожидаемые вычисления Параграф 19: Изучите причины возникновения временных объектов Параграф 20: Облегчайте оптимизацию возвращаемого значения Параграф 21: Используйте перегрузку, чтобы избежать неявного преобразования типов Параграф 22: По возможности применяйте оператор присваивания вместо отдельного оператора Параграф 23: Используйте разные библиотеки Параграф 24: Учитывайте затраты, связанные с виртуальными функциями, множественным наследованием, виртуальными базовыми классами и RTTI Приемы Параграф 25: Делайте виртуальными конструкторы и функции, не являющиеся членами класса Параграф 26: Ограничивайте числа объектов в классе Параграф 27: В зависимости от ситуации требуйте или запрещайте размещать объекты в куче Параграф 28: Используйте интеллектуальные указатели Параграф 29: Используйте подсчет ссылок Параграф 30: Применяйте прокси-классы Параграф 31: Создавайте функции, виртуальные по отношению более чем к одному объекту Разное Параграф 32: Программируйте, заглядывая в будущее Параграф 33: Делайте нетерминальные классы абстрактными Параграф 34: Умейте использовать C++ и C в одной программе Параграф 35: Ознакомьтесь со стандартом языка Эффективное использование STLГлава 1: Контейнеры Параграф 1: Проявляйте здравый смысл при выборе контейнера Параграф 2: Остерегайтесь иллюзий относительно контейнерно-независимого кода Параграф 3: Делайте копирование объектов в контейнерах дешевым и корректным Параграф 4: Вызывайте функцию empty вместо сравнения size() с нулем Параграф 5: Предпочитайте функции, работающие с диапазонами, их одноэлементным аналогам Параграф 6: Обращайте внимание на неприятные особенности синтаксического анализа в C++ Параграф 7: При использовании контейнеров, хранящих указатели, выделенные new, не забывайте вызвать delete перед уничтожением контейнера Параграф 8: Никогда не помещайте объекты типа auto_ptr в контейнеры Параграф 9: Тщательно выбирайте способ очистки Параграф 10: Помните о соглашениях и ограничениях распределителей памяти Параграф 11: О правильном применении специализированных распределителей памяти Параграф 12: О реалистических ожиданиях относительно потоковой безопасности STL-контейнеров Глава 2: vector и string Параграф 13: Предпочитайте vector и string динамически выделенным массивам Параграф 14: Используйте reserve для избежания ненужных операций перераспределения памяти Параграф 15: Учитывайте различия в реализациях string Параграф 16: Как передавать vector и string унаследованным программным интерфейсам Параграф 17: Используйте «swap-трюк» для сокращения избыточной емкости Параграф 18: Избегайте применять vector<bool> Глава 3: Ассоциативные контейнеры Параграф 19: Разберитесь, чем равенство отличается от эквивалентности Параграф 20: Специфицируйте способ сравнения для ассоциативных контейнеров, содержащих указатели Параграф 21: Позаботьтесь о том, чтобы функции сравнения возвращали false для равных значений Параграф 22: Избегайте модификации ключей «по месту» в контейнерах set и multiset Параграф 23: Рассмотрите замену ассоциативных контейнеров отсортированными векторами Параграф 24: Тщательно выбирайте между map::operator[] и map::insert, когда важна эффективность. Параграф 25: Ознакомьтесь с нестандартными кэшированными контейнерами Глава 4: Итераторы Параграф 26: Старайтесь использовать iterator вместо const_iterator, reverse_iterator и const_reverse_iterator Параграф 27: Используйте distance и advance для преобразования const_iterator в iterator Параграф 28: Научитесь использовать базовый iterator, соответствующий reverse_iterator Параграф 29: Подумайте о применении istreambuf_iterator для посимвольного ввода Глава 5: Алгоритмы Параграф 30: Обеспечивайте достаточно большие целевые диапазоны при копировании Параграф 31: Изучите различные варианты сортировки Параграф 32: После вызова алгоритма remove или ему подобного не забывайте вызвать алгоритм erase, если действительно хотите что-то удалить Параграф 33: Будьте осторожны при использовании алгоритма remove и ему подобных для контейнеров, содержащих указатели Параграф 34: Не забывайте, что некоторые алгоритмы ожидают отсортированных диапазонов Параграф 35: Реализуйте простое независимое от регистра сравнение строк с помощью алгоритмов mismatch или lexicographical_compare Параграф 36: Разберитесь, как правильно реализовать алгоритм copy_if Параграф 37: Используйте accumulate или for_each для суммирования диапазонов Глава 6: Функторы, функторные классы, функции и т. п. Параграф 38: Проектируйте классы-функторы для передачи по значению Параграф 39: Делайте предикаты свободными функциями Параграф 40: Делайте классы-функторы адаптируемыми Параграф 41: Зачем нужны ptr_fun, mem_fun и mem_fun_ref Параграф 42: Убедитесь, что less<T> означает operator< Глава 7: Программирование с использованием STL Параграф 43: Предпочитайте вызовы алгоритмов вручную написанным циклам Параграф 44: Предпочитайте функции-члены алгоритмам с теми же именами Параграф 45: О различиях между count, find, binary_search, lower_bound, upper_bound и equal_range. Параграф 46: Рассмотрите применение функциональных объектов вместо функций в качестве параметров алгоритмов Параграф 47: Избегайте создания кода «только для записи» Параграф 48: Всегда включайте необходимые заголовочные файлы Параграф 49: Научитесь понимать диагностические сообщения компилятора, касающиеся STL Параграф 50: Посещайте Web-сайты, посвященные STL |
|
||
Главная | Контакты | Нашёл ошибку | Прислать материал | Добавить в избранное |
||||
|