Небольшое предостережение в начале: все эти ответы в некоторой степени зависят от операционной системы и аппаратной архитектуры. Windows делает вещи радикально иначе, чем UNIX-подобные языки, операционные системы реального времени и старые UNIX для небольших систем.
Но основной ответ, как сказали @Richie и @Paul, "да". Когда ваш компилятор и компоновщик завершают работу с кодом, он разбивается на так называемые сегменты «текст» и «данные» в UNIX. текстовый сегмент содержит инструкции и некоторые виды статических данных; сегмент данных содержит, ну, данные.
Большая часть сегмента данных затем выделяется для стека и пространства кучи. Другие чанки могут быть выделены для таких вещей, как статические или внешние структуры данных.
Так что да, когда программа запускается, счетчик программ активно извлекает инструкции из сегмента, отличного от данных. Теперь мы попадаем в некоторые архитектурные зависимости, но в целом, если у вас есть сегментированная память, ваши инструкции построены таким образом, что выборка байта из сегментов максимально эффективна. В старой архитектуре 360 они имели базовых регистров , в x86 есть куча волос, которые росли по мере того, как адресное пространство переходило на старые 8080-е годы для современных процессоров, но все инструкции очень тщательно оптимизированы, поскольку, как вы можете себе представить, выборка инструкций и их операндов очень интенсивна б.
Теперь перейдем к более современным архитектурам с виртуальной памятью и блоком управления памятью s. Теперь у машины есть специальное оборудование, которое позволяет программе обрабатывать адресное пространство как большой плоский диапазон адресов; различные сегменты просто помещаются в это битовое виртуальное адресное пространство. Работа MMU состоит в том, чтобы взять виртуальный адрес и преобразовать его в физический адрес, в том числе, что делать, если этот виртуальный адрес вообще не находится в физической памяти в данный момент. Опять же, аппаратное обеспечение MMU очень сильно оптимизировано, но это не означает, что с производительностью связаны нет производительности. Но поскольку процессоры стали быстрее, а программы стали больше, это становится все менее и менее важным.