Ограничение использования регистров в C

Мой вопрос очень похож на: GCC: запретить использование некоторых регистров

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

Единственные 2 возможных решения, о которых я думал, были:

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

Поскольку я пытаюсь сделать все это на C, может ли здесь прекомпилятор как-то помочь? Есть ли возможные пути для достижения моей намеченной цели?


person Oscar Wahltinez    schedule 20.06.2012    source источник
comment
Могу я спросить, почему вы хотите это сделать?   -  person Wug    schedule 20.06.2012
comment
Если вы пытаетесь запретить определенные регистры, то вы уже не на уровне C.   -  person Ignacio Vazquez-Abrams    schedule 20.06.2012
comment
@Wug Я играю с планировщиками и переключением задач, и мне было интересно, возможно ли такое, так что это не для практических приложений, по крайней мере, сейчас   -  person Oscar Wahltinez    schedule 20.06.2012
comment
Вероятно, вам будет гораздо лучше не беспокоиться об этом и позволить компилятору использовать регистры так, как он считает нужным. Если вы все равно беспокоитесь об этом, то вы имеете дело с программированием на языке ассемблера, а не с программированием на C.   -  person Jonathan Leffler    schedule 20.06.2012
comment
@ IgnacioVazquez-Abrams Я понимаю это, но в C есть несколько удобных ключевых слов, которые позволяют вам перейти на более низкий уровень, например Register, поэтому мне было интересно, есть ли что-то в этом роде, что можно было бы применить здесь   -  person Oscar Wahltinez    schedule 20.06.2012
comment
Даже ключевое слово register — это всего лишь предложение. Компилятор все равно попытается сохранить переменные в регистре, ключевое слово register предписывает ему предпочесть одну конкретную переменную другим, если есть такая возможность.   -  person Wug    schedule 20.06.2012
comment
«Стандарт C» не имеет механизмов делать то, что вы хотите. Некоторые специальные компиляторы для конкретного оборудования, над которым вы работаете, могут иметь вспомогательные расширения, но они по своей сути зависят от платформы (типа процессора) и компилятора. Поскольку вы не указали платформу и компилятор, никто пока не может дать вам точный совет.   -  person Jonathan Leffler    schedule 20.06.2012
comment
Ключевое слово «register» не позволяет вам перейти на более низкий уровень — в лучшем случае оно предназначено для того, чтобы дать компилятору подсказку об ожидаемой частоте использования переменной и рекомендовать ее размещение в регистре. Однако это не гарантирует, что это будет сделано.   -  person twalberg    schedule 20.06.2012


Ответы (1)


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

person Wug    schedule 20.06.2012
comment
Я мог бы, по крайней мере, использовать компиляцию для каждой функции или вызывать каждую функцию во встроенном ассемблере, используя регистры засорения, поэтому я действительно не могу установить Нет, нет, как мой принятый ответ - person Oscar Wahltinez; 20.06.2012
comment
Организация регистров — это в значительной степени именно то, что использование языков более высокого уровня, чем язык ассемблера, должно абстрагироваться от процесса написания программ. Лучше всего, вероятно, написать критические подпрограммы на ассемблере и вызывать их из C. - person Wug; 20.06.2012
comment
В качестве альтернативы вы можете использовать флаг компилятора -S (работает с gcc и, возможно, другими), чтобы сократить ваши исходные файлы c до языка ассемблера и поиграть с выводом перед их полной компиляцией. - person Wug; 20.06.2012