Читать книгу Ссылки и указатели в C++: от основ к безопасности и современному коду - - Страница 44
Виртуальная память контекст для реального мира
ОглавлениеВиртуальная память (Virtual Memory) – это хитрый трюк операционной системы, который позволяет вашей C++-программе думать, что у неё в распоряжении огромный, непрерывный блок памяти, даже если физическая RAM ограничена. Представьте, что вы король в замке: виртуальная память создаёт иллюзию бесконечных земель, но на деле ОС (как мудрый управляющий) жонглирует реальными ресурсами, скрывая от вас детали. Мы разберём это минимально, только для контекста, чтобы понять, почему адреса в вашем коде не "настоящие" и как это влияет на C++.
В основе лежит адресное пространство процесса: каждый процесс (ваша программа) получает виртуальное адресное пространство от 0 до максимума (4 ГБ в 32-битных системах, до 128 ТБ или больше в 64-битных). Когда вы пишете int* ptr = new int;, ptr содержит виртуальный адрес. ОС маппит (отображает) эти виртуальные адреса на физическую память (RAM) или даже на диск, используя страницы фиксированные блоки, обычно 4 КБ. Если физической памяти не хватает, ОС "свопит" (swapping) страницы на диск (файл подкачки, swap file), освобождая RAM для активных данных. Когда программа обращается к свайпнутой странице, ОС возвращает её в RAM это называется page fault, и оно может замедлить программу (диск медленнее RAM в тысячи раз).
Для C++ это значит:
Все адреса, которые вы видите (&x, ptr), виртуальные. Они уникальны для вашего процесса и не конфликтуют с другими программами.
Выделение памяти (new, malloc) запрашивает у ОС виртуальные страницы. Если ОС не может предоставить (Out Of Memory, OOM), new бросит std::bad_alloc.
Виртуальная память предотвращает фрагментацию: даже если физическая память "дырявая" (фрагментирована), ваш код видит непрерывный блок.