register
является подсказкой, что компилятор может хранить переменную в регистрах.Вы не можете заставить компилятор использовать больше регистров, чем существует в целевой архитектуре, по очевидной причине, что это невозможно.
В C ключевое слово register
просто означает, что адрес переменной можетне будет принятоЭто мешает вам делать все, что мешает компилятору хранить его в регистре, но не требует, чтобы было в регистре.
С https://en.cppreference.com/w/c/language/storage_duration
Спецификатор регистра разрешен только для объектов, объявленных в области блока, включая списки параметров функции.Он указывает продолжительность автоматического хранения и отсутствие привязки (которая используется по умолчанию для объявлений такого типа), но дополнительно намекает оптимизатору сохранить значение этой переменной в регистре ЦП, если это возможно.Независимо от того, происходит эта оптимизация или нет, объявленный регистр переменных не может использоваться в качестве аргументов оператора address-of, он не может использовать alignas (начиная с C11), а массивы регистров не конвертируются в указатели.
В течение многих лет он ничего не делал: оптимизирующие компиляторы уже по возможности сохраняют переменные в regs.Для переменных, которые являются глобальными или у которых был взят их адрес, то, возможно, только для части функции, сохраняя результат обратно в память, если переменная не может быть оптимизирована.
BTW, register
официально объявлен устаревшим в C ++, а C ++ 17 фактически удалил его из языка.https://en.cppreference.com/w/cpp/language/storage_duration.
Связанный: GNU C имеет register int foo asm("eax");
(или любой другой регистр), но даже это только гарантированно , чтобы иметь эффект при использовании в качестве операнда дляоператор inline-asm при использовании для локальных переменных.В текущих версиях GCC это заставляет компилятор использовать этот регистр для переменной, если только ему не нужно разлить / перезагрузить его, чтобы стек памяти при вызовах функций или что-то в этом роде.
https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html
Но в GNU C вы можете использовать глобальные переменные регистров, где регистр выделен глобальному на всю жизнь вашей программы, что мешает оптимизации кода, который не использует эту переменную.Это интересный вариант, но не тот, который вам следует использовать.