Таким образом, данные могут находиться в разных местах, где они могут изменяться автоматически (действиями операционной системы), и при работе в обычных программах вам, как правило, не нужно знать об этом.
Во-первых, тот факт, что вы объявляете массив в исходном коде, не обязательно означает, что полный массив или какой-либо другой массив вообще создается в памяти. Компилятор может оптимизировать исходный код способами, исключающими часть или весь массив.
Однако предположим, что массив действительно создан. Виртуальная память создается для того, чтобы создать иллюзию того, что процесс использует исключительно физическую память и / или имеет больше памяти, чем фактически доступно в качестве физической памяти. Цель этой иллюзии состоит в том, что процессы не должны беспокоиться о том, где на самом деле находятся их данные. И подавляющее большинство нормальных процессов может пренебречь этим.
Кроме того, по большей части компиляторы будут уделять мало внимания расположению небольших объектов относительно границ страницы. Обычно не имеет большого значения, будет ли массив 100 int
размещен так, чтобы он целиком находился в пределах одной страницы, или чтобы он занимал границу страницы.
Когда необходимо знать, где находятся данные, или влиять на них, возникает ряд вопросов.
Существуют способы повлиять на расположение данных относительно границ страниц, либо используя системные или библиотечные вызовы для этой цели, либо выделяя избыточную память, а затем помещая данные в выбранное место внутри нее.
Если данные важны и предпочитаются или должны оставаться в физической памяти, могут потребоваться системные вызовы (конечно, в зависимости от системы) для запроса этого.
При отсутствии таких конкретных запросов расположение данных зависит от ряда факторов. Если вы объявляете статический массив int
и инициализируете его данными времени компиляции, данные могут появиться в разделе исполняемого файла, который в конечном итоге создается. В некоторых системах при запуске исполняемого файла система не загружает весь файл в память. Он загружает различные части данных из исполняемого файла только тогда, когда на них ссылаются. Таким образом, эти данные могут изначально находиться на диске. После загрузки в память, если система обременена другими вещами, нуждающимися в памяти, система может удалить эти данные из памяти, чтобы они снова существовали только в исполняемом файле на диске.
С другой стороны, если данные генерируются во время выполнения программы, они, конечно, находятся в памяти, когда программа генерирует их. Однако, опять же, если система обременена другими требованиями, система может удалить данные из памяти. В этом случае, поскольку данные еще не существуют на диске (как данные в исполняемом файле), данные сначала записываются на страницу или в файл подкачки на диске.
Обычно, когда данные могут меняться со временем.