Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Хорошая книга по работе с памятью в C++

#cpp #memory_management


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

Описание вопроса довольно расплывчатое. Привожу пример вопросов, который меня интересует:


Когда вызывается new/delete как программа/ОС хранит информацию о выделенные участках
памяти. Как виртуальное адресное пространство соотносится с реальным адресным пространством.
Что из себя представляет класс в памяти. А если класс наследуется от двух других
классов с виртуальными функциями.
Exception-ы в конструкторах/деcтрукторах и особенности для многопоточных приложений.
Как реализуется Exception на низком уровне.
Оптимизация выделения памяти. Собственный аллокатор памяти.
Создание/удаление объектов в программе с несколькими модулями.


Возможно эти вопросы будут отражены в разных книгах, буду рад любым. Насчёт специфики
ОС и разных компиляторов: интересны любые варианты.
    


Ответы

Ответ 1



Про механизмы распределения памяти, потоки и межпроцессную/межпоточную синхронизацию нужно читать книги об устройстве операционных систем. Можно порекомендовать: Таненбаум, Бос. Современные операционные системы Дейтел Х.М. Операционные системы. Том 1. Основы и принципы. Таненбаум Э.С., Вудхалл А.С. Операционные системы. Разработка и реализация Описание реализации принципов работы операционных систем можно почитать в Лав. Ядро Linux: описание процесса разработки и Labrosse. µC/OS-II: The Real-Time Kernel Об алгоритмах распределения памяти рассказывается также в Ахо, Хопкрофт, Ульман. Структуры данных и алгоритмы Написание своих распределителей памяти обсуждается в Джосаттис. Стандартная библиотека C++: справочное руководство. Также этот вопрос затронут в Керниган, Ритчи. Язык программирования C Разработке многопоточных приложений на C++11 посвящена книга Уильямс. Параллельное программирование на С++ в действии Еще есть книга о "внутреннем устройстве" C++: Lippman, Inside the C++ Object Model. Она довольно старая - возможно там описаны не все интересующие темы.

Ответ 2



Одной книги покрывающей всё это, разумеется,— нет. По первому вопросу можно почитать Structured Computer Organization и Modern Operating Systems По второму книги есть вряд ли, т.к. область весьма специфичная и подвержена изменениям, тут лучше искать статьи. У меня есть две статьи на эту тему: Размещение объектов. Часть 1: Основы и Размещение объектов. Часть 2: Виртуальность По третьему вопросу книг читать не надо: исключения в конструкторе это нормально, деструктор исключения покидать не должны. По умолчанию, с C++11, исключение, которое покинет деструктор, вызовет std::terminate и приложение будет завершено. Многопоточность не имеет отношения ни к деструктору, ни к конструктору. Они не могут быть одновременно выполнены в разных потоках(если конечно не вызвать их явно для глобального объекта, но это экзотика) По четвёртому вопросу тот же Танненбаум, вышеупомянутый, для общего развития, а потом статьи в интернете. Но Вы не хотите писать свой аллокатор, правда. Вот неплохое видео по аллокаторам, от Александреску. И вот кусок книги(Supplementary Chapter) от одного замечательного автора, я не читал это приложение к книге, но читал основную книгу — автор всё очень хорошо описывает. Правда на английском, и видео и книга. Пятый вопрос: тоже нужно искать статьи в интернете. Если вкратце: если не хотите иметь головную боль, то лучше освобождать память посредством того же модуля, что её выделял.

Комментариев нет:

Отправить комментарий