Может ли компилятор когда-либо генерировать код для выгрузки частей сегмента кода во время выполнения? - PullRequest
5 голосов
/ 26 сентября 2010

Помимо концепции Dll, которая обеспечивает возможность загрузки / выгрузки методов или функций во время выполнения, мне интересно, может ли компилятор когда-либо сказать что-то вроде, хорошо, так как эта конкретная часть кода занимает значительное количество места в кодесегмент и никогда больше не будет использоваться после этой точки во время выполнения программы, было бы хорошо сгенерировать некоторый код для выгрузки этой части сегмента кода после достижения этой конкретной точки во время выполнения программы, чтобы общее пространство, занимаемое сегментом кода, становилось меньше.Это просто выдумка или это может произойти?

Ответы [ 4 ]

4 голосов
/ 26 сентября 2010

Конечно.Существует метод, называемый overlaying , который загружает разный код в один и тот же бит адресного пространства в разное время.Иногда это делалось вручную, иногда помогали компиляторы.Иногда загрузка выполняется программно, иногда аппаратно (с мультиплексированием адресов, так что, например, во время загрузки один бит адресного пространства считывается с микросхемы ПЗУ, но после загрузки он переключается на адрес ОЗУ или другое ПЗУ).

Наложение было гораздо более распространенным явлением, когда у компьютеров было меньше памяти, например, в первые дни DOS, когда у вас было в лучшем случае 640 КБ, а часто даже и этого.В наши дни у него все еще есть приложения для встраиваемых систем, где память и / или адресное пространство стоят дорого.

3 голосов
/ 26 сентября 2010

Да, драйверы устройств Windows используют эту технику. Файл LE имеет определенные сегменты кода, помеченные как отбрасываемые. Операционная система также может в определенное время принять такое решение для замены сегментов кода, которые не использовались в течение длительного времени.

Строго говоря, это не та область, с которой компилятор может поиграться. Это в основном компоновщик / загрузчик / ОС, которые влияют на это.

3 голосов
/ 26 сентября 2010

Компилятор может делать все, что захочет, при условии, что это не нарушает стандарт.Если он может выяснить, что код никогда не вызывается снова, он может полностью отказаться от него.

Он может даже заменить его на функцию-заглушку меньшего размера, которая перезагрузит код, если это потребуется.* Но вы вряд ли когда-либо увидите это в современной ОС, поскольку сама ОС предоставляет эту возможность под прикрытием.

Операционные системы (по крайней мере, обычные) заменят ваши физические страницы, когда памятьзаканчивается, и они не будут перезагружены, пока они не нужны (обычно из-за ошибки страницы при попытке доступа к ним).

1 голос
/ 26 сентября 2010

Я не знаю компилятора, который делает это, но нет правила, запрещающего это.Если компилятор может доказать, что это не изменит семантику программы, то это разрешено в соответствии с правилом «как если бы».

Однако обычно в этом нет необходимости, поскольку неиспользуемый код уже может быть замененкак часть механизма файла подкачки, связанного с виртуальной памятью.(и потому, что вы, вероятно, сэкономите только несколько КБ памяти)

...