Ответ 1
Нет надежного и портативного способа определения размера регистра с C. C даже не имеет понятия "регистры" (описание ключевого слова register
не упоминает регистры CPU).
Но он определяет набор целочисленных типов, которые являются самым быстрым типом, по крайней мере, указанного размера. <stdint.h>
определяет uint_fastN_t
, для N = 8, 16, 32, 64.
Если вы считаете, что регистры не менее 32 бит, то uint_fast32_t
, вероятно, будет иметь тот же размер, что и регистр, либо 32, либо 64 бит. Это не гарантируется. Вот что говорит стандарт:
Каждый из следующих типов обозначает целочисленный тип, который обычно быстрее всего работать со всеми целыми типами, которые имеют по крайней мере указанная ширина.
со сноской:
Назначенный тип не гарантируется как самый быстрый для всех целей; если в реализации нет четких оснований для выбора одного типа другой, он просто выберет некоторый целочисленный тип, удовлетворяющий требования к подписке и ширине.
Фактически, я полагаю, что использование типов [u]int_fastN_t
выражает ваши намерения более четко, чем попытки сопоставления размера регистра CPU.
Если это не работает для какой-либо цели, вам нужно добавить специальный случай
#if
или #ifdef
для выбора подходящего типа. Но uint_fast32_t
(или uint_fast16_t
, если вы хотите поддерживать 16-разрядные системы), вероятно, является лучшей отправной точкой, чем size_t
или int
.
Быстрый эксперимент показывает, что при компиляции с gcc -mx32
обе uint_fast16_t
и uint_fast32_t
составляют 32 бита. Они оба 64 бит при компиляции без -mx32
(в моей системе x86_64). Это означает, что, по крайней мере, для gcc типы uint_fastN_t
не выполняют то, что вы хотите. Вам понадобится специальный код для x32. (Возможно, gcc должен использовать 64-битные типы для uint_fastN_t
в режиме x32. Я просто разместил этот вопрос, спрашивая об этом.)
Этот вопрос спрашивает, как определить среду x32 в препроцессоре. gcc не дает прямого способа определить это, но я только что опубликовал ответ, предлагающий использовать макросы __x86_64__
и SIZE_MAX
.