Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [ 40 ] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

конструктор виртуального базового класса. Этот подход обеспечивает решение для двух конструкторов и имеет дополнительное преимущество, заключающееся в том, что он работает даже для классов, которые являются опосредованно производными от Base, так что эго действительно единственная альтернатива, которая может использоваться в сочетании с решением примера 19-4. Правда, в этом случае корректными окажутся неявно сгенерированные оператор копирующего присваивания и деструктор производного класса.

Резюме

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



Управление памятью и ресурсами

Если и есть какая-то проблема, дорогая сердцу программистов иа С и С+ + , то это -- управление памятью и другими ресурсами. Одна из самых сильных сторон С++ по сравнению с другими языками заключается в той мощи, которую С-+-+ предоставляет программисту для управления памятью и другими ресурсами, в частности, для выборочного автоматического управления памятью при использовании стандартных контейнеров.

Насколько хорошо вы понимаете, как используется память различными стандартными контейнерами? Можете ли вы с уверенностью утверждать, что контейнер list, содержащий 1 ООО объектов, будет требовать меньший объем памяти, чем, например, контейнер set с 1 ООО объектов того же типа? Или, возвращаясь к вопросам безопасности исключений: поможет ли использование версии оператора new, не генерирующей исключений, сделать код более безопасным? И наконец, почему на многих современных платформах не имеет смысла беспокоиться о возможных отказах при выполнении оператора new?



Задача 20. Контейнеры в памяти.

Часть 1: уровни управления памятью Сложность: 3

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

Вопрос для новичка

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

Вопрос для профессионала

2. В чем состоит отличие различных уровней управления памятью в контексте стандартной библиотеки С++ и типичных средах, в которых используются реализации этой библиотеки? Что можно сказать об их взаимоотношениях, как они взаимодействуют друг с другом и как между ними распределяются обязанности?

Решение

Главный вопрос рассматриваемой пары задач будет задан в задаче 21 - сколько памяти используют разные стандартные контейнеры для хранения одинакового количества объектов одного и того же типа т?

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

• внутренние структуры данных, используемые контейнерами, такими как vector, deque, list, set/multiset и map/multimap; и

• как работает распределение динамической памяти.

Давайте начнем с распределения- динамической памяти, а затем разберемся, что это означает для стандартной библиотеки.

Диспетчеры памяти и их стратегии: краткий обзор

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

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

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [ 40 ] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85