Понятие о переменных регистра (тип данных: регистр) на языке Си? - PullRequest
4 голосов
/ 28 сентября 2010

Я просто хочу получить представление о том, как обрабатываются переменные регистра в исполняемых файлах программы C. т.е. в каком месте (или в реестре) он точно хранится в случае встроенной системы и на компьютере X86 (исполняемая программа C на настольном ПК)?

А как насчет этого представления? (поправьте меня, если я не прав)

Предположим, мы объявили / инициализировали одну переменную внутри функции как тип данных 'int'. Обычно он попадает в сегмент стека и будет там в этом разделе только во время выполнения, когда вызывающая сторона вызывает вызываемого, содержащего локальную переменную. Но если мы объявим локальную переменную выше как 'register int', то она также перейдет в сегмент стека. Но во время выполнения процессор поместил эту локальную переменную из стека в свои регистры общего назначения (из-за дополнительного кода, вставленного компилятором из-за ключевого слова 'register') и быстрого доступа к ней оттуда.

Это единственное различие между ними при доступе во время выполнения, и между ними нет различий в загрузке памяти.

__ Кану

Ответы [ 5 ]

10 голосов
/ 28 сентября 2010

Ключевое слово register в C (редко когда-либо встречающееся) является всего лишь подсказкой для компилятора, что может быть полезно сохранить переменную в регистре для более быстрого доступа.* Компилятор может игнорировать подсказки и оптимизировать, как он видит лучше.

Поскольку современные компиляторы намного лучше людей понимают использование и скорость, ключевое слово register обычно игнорируется современными компиляторамив некоторых случаях может фактически замедлить скорость выполнения.

7 голосов
/ 28 сентября 2010

Из K & R C:

Переменная регистра сообщает компилятор, что рассматриваемая переменная будет интенсивно использоваться. Идея в том, что переменные регистра должны быть помещены в машинные регистры, которые могут привести к меньшие и более быстрые программы. Но компиляторы могут игнорировать это совет.

Невозможно получить адрес переменной регистра, независимо от того, действительно ли переменная помещена в регистр.

Следовательно,

register int x;
int *y = &x; // is illegal  

Итак, вы должны взвесить минусы невозможности получить адрес переменной регистра.

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

В дополнение к ответу Крипто (который имеет мой голос) просто посмотрите имя register для ключевого слова как исторический неправильный термин.Он не имеет ничего общего с регистрами, как вы изучаете его в классе, например, для модели процессора фон Неймана, но является лишь подсказкой компилятору, что эта переменная не нуждается в адресе. безадресная переменная может быть реализована различными способами (например, оператором непосредственного ассемблера) или полностью оптимизирована.Пометка переменной как register может быть полезной подсказкой по оптимизации для компилятора, а также полезной дисциплиной для программиста.

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

Когда компилятор берет свой внутренний код и серверная часть превращает его в машину / ассемблер для целевого процессора, он отслеживает регистры, для которых он генерирует инструкции, поскольку он создает код. Когда ему нужно выделить регистр для загрузки или отслеживания переменной, если есть неиспользуемая рабочая переменная, он помечает ее как использованную и генерирует инструкции, используя этот регистр. Но если во всех рабочих регистрах есть что-то в них, то оно обычно будет где-то высылать содержимое одного из этих регистров, часто, например, в глобальную память или стек, если у этой переменной есть дом. Компилятор может или не может быть умным об этом решении и может исключить широко используемую переменную. Используя ключевое слово register, в зависимости от компилятора, вы можете повлиять на это решение, он может выбрать сохранение переменных ключевого слова register в регистрах и исключать незарегистрированные переменные ключевого слова в память по мере необходимости.

0 голосов
/ 29 сентября 2010

в каком месте (или зарегистрировать) оно точно хранится в случае встроенной системы и на машине> X86 (исполняемая на компьютере программа C)?

Вы не узнаете, не открыв вывод сборки, который будет подвержен сдвигу в зависимости от выбора компилятора. Рекомендуется проверять сборку только в ознакомительных целях.

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

Обычно при использовании стандартного компилятора C для x86 / amd64 (gcc, icc, cl) можно разумно предположить, что компилятор достаточно хорошо оптимизируется для большинства целей.

Если, однако, вы используете нестандартный компилятор, например, компилятор, созданный для новой встроенной системы, рекомендуется рассмотреть вопрос об оптимизации рук. Если архитектура новая, возможно, стоит подумать об оптимизации рук.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...