Как правило, лучше использовать регистры процессора в полной мере. Для переносного фрагмента кода это означает использование арифметики и хранения на 64 бита на 64-битном процессоре, и только 32-битные на 32-битном процессоре (в противном случае 64-битные инструкции будут эмулироваться в 32-битном режиме, что приведет к разрушительные действия).
Это означает, что необходимо определить размер регистров процессора, как правило, во время компиляции (поскольку тесты времени выполнения дороги).
В течение многих лет я использовал простой эвристический sizeof(nativeRegisters) == sizeof(size_t)
.
Он отлично работает для многих платформ, но он выглядит неправильно эвристическим для linux x32: в этом случае size_t
только 32-битные, в то время как регистры все еще могут обрабатывать 64-битные. Это приводит к некоторым потерянным возможностям производительности (значимым для моего варианта использования).
Я бы хотел правильно определить полезный размер регистров процессора даже в такой ситуации.
Я подозреваю, что могу попытаться найти какой-то конкретный макрос компилятора для специального режима x32. Но мне было интересно, существует ли нечто более общее, чтобы охватить больше ситуаций. Например, другой целью будет OpenVMS 64-бит: там собственный размер регистра - 64 бит, но size_t
- это всего 32 бита.