В общем, компиляторы действительно знают этот материал (и как его лучше всего использовать), поэтому я немного удивлен, что вы считаете, что можете перехитрить компилятор - если у меня нет очень высокого знания домена и начните писать код ассемблера, я очень редко перехитрил компилятор.
Поскольку запись кода ассемблера очень неспортивна, я не думаю, что это считается решением для оптимизации кода с использованием знаний о том, сколько регистров и т. Д. Очень сложно знать, как компилятор использует регистры. Если у вас есть int x = y + z;
в качестве простого примера, сколько регистров требуется? Зависит от компилятора - он может использовать ни один, один, два, три, четыре, пять или шесть, не будучи ниже оптимального использования регистров - все зависит от того, как компилятор решает разобраться с вещами, машинной архитектурой, где/сохраняются и т. д. Тот же принцип применяется к числу регистров с плавающей запятой, если мы изменим int
на double
. Нет очевидного способа рассказать, сколько регистров используется в этом заявлении (хотя я подозреваю не более трех, однако он может быть равен нулю или одному, в зависимости от того, что решает компилятор).
Возможно, вы можете сделать некоторые умные трюки, если знаете архитектуру процессора и то, как компилятор имеет дело с определенными типами кода, - но это также предполагает, что компилятор не изменит свое поведение в следующей версии. Но если вы знаете, что такое архитектура процессора, то вы также знаете количество регистров различного типа ...
Не в переносном C или C++ - они даже не определяют, что такое ЦП, не говоря уже о регистре. Вы можете найти библиотеку или вызовы, специфичные для ОС, для получения этой информации, но звучит так, будто вам лучше создавать исполняемые файлы для ОС и чипов. – Mat
@mat что вы используете в портативных c или C++? Знаете ли вы какую-нибудь библиотеку? – mjr
C или C++ код, который использует только конструкции, определенные в их соответствующих стандартах, и не полагается на какие-либо трюки, специфичные для реализации. – Mat