#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) от одного замечательного автора, я не читал это приложение к книге, но читал основную книгу — автор всё очень хорошо описывает. Правда на английском, и видео и книга. Пятый вопрос: тоже нужно искать статьи в интернете. Если вкратце: если не хотите иметь головную боль, то лучше освобождать память посредством того же модуля, что её выделял.
Комментариев нет:
Отправить комментарий