Я знаю, что это более «тяжелый» вопрос, но я думаю, что он тоже интересен.Это было частью моих предыдущих вопросов о функциях компилятора , но тогда я объяснил это очень плохо, и многие ответили только на мой первый вопрос, так что это так:
Итак, если мои знанияверно, современные системы Windows используют подкачку как способ переключения задач и обеспечения того, чтобы каждая задача имела свое место в памяти.Таким образом, каждый процесс занимает свое место, начиная с 0.
Когда многозадачность вступает в силу, Kernel должен сохранить все важные регистры в стеке задачи, как я считаю, чем сохранить текущий указатель стека, изменить запись страницы напереключение на физическое адресное пространство другого процесса, загрузка нового указателя стека процессов, извлечение сохраненных регистров и продолжение путем вызова адреса указателя всплывающей инструкции.
Из-за этой приятной функции (подкачки) каждый процесс считает, что у него хорошая квартирапамять в пределах досягаемости.Таким образом, нет дальних переходов, дальних указателей, сегмента памяти или сегмента данных.Все хорошо и линейно.
Но, когда для процесса больше нет сегментации, почему все еще компиляторы создают переменные в стеке или когда глобальны непосредственно в другом пространстве памяти, чем непосредственно в программном коде?
Позвольте мне привести пример, у меня есть код C: int a=10;
, который переводится в (синтаксис Intel): mov [position of a],#10
Но чем, на самом деле вы занимаетесь?больше байтов в оперативной памяти, чем необходимо.Поскольку первые несколько байтов принимают инструкцию actall, а после выполнения этой инструкции появляется новый байт, содержащий значение 10.
Почему вместо этого нет необходимости переключать какой-либо сегмент (таким образом,скорость процесса) - это не просто значение 10, закодированное непосредственно в программу, например:
xor eax,eax //just some instruction<br>
10 //the value iserted to the program<br>
call end //just some instruction
Поскольку компилятор знает точное положение каждой инструкции при работе с этой переменной,он просто использовал бы его адрес.
Я знаю, что переменные const делают это, но на самом деле они не являются переменными, когда вы не можете их изменить.
Надеюсь, я хорошо изложил свой вопрос, но я все еще изучаю английский, так что простите мои синтаксические и даже семантические ошибки.
РЕДАКТИРОВАТЬ:
Я прочитал ваши ответы, и, похоже, основываясь на них, я могу изменить свой вопрос:
Итак, кто-то сказал здесь, что глобальная переменная на самом деле - это та часть значений, которая прикреплена непосредственно к программе, я имею в виду, когда переменная глобальная, является ли онаd до конца программы, или просто созданный как локальный во время выполнения, но вместо того, чтобы быть в стеке в куче напрямую?
Если первый случай - привязан к самой программе, то почемусуществование локальных переменных?Я знаю, вы скажете мне из-за рекурсии, но это не так.Когда вы вызываете функцию, вы можете поместить любое пространство памяти в стек, поэтому там нет никакой программы.
Надеюсь, вы меня понимаете, использование памяти всегда неэффективно, когда какое-то значение (даже 0)созданный в стеке из некоторой инструкции, потому что вам нужно место в программе для этой инструкции, а не для фактической переменной.Вот так: push #5 //instruction that says to create local variable with integer 5
И затем эта инструкция просто делает номер 5 в стеке.Пожалуйста, помогите мне, я действительно хочу знать, почему это так.Спасибо.