int_least64_t vs int_fast64_t vs int64_t

Я пытаюсь передать свой код на 64-битный.

Я обнаружил, что C++ обеспечивает 64-битные целые типы, но я все еще смущен.

Во-первых, я обнаружил четыре разных 64-битных int s:

int_least64_t
int_fast64_t
int64_t
intmax_t

и их неподписанные коллеги. Я тестировал их с помощью sizeof() и они 8 байтов, поэтому они 64 бит.

Какая разница между ними? В чем смысл least и fast типов? Как насчет intmax_t?

Ответ 1

На вашей платформе все имена для одного и того же базового типа данных. На других платформах это не так.

int64_t требуется ТОЧНО 64 бита. На архитектурах с (например) 9-битным байтом он вообще не будет доступен.

int_least64_t - наименьший тип данных с не менее чем 64 битами. Если int64_t доступен, он будет использоваться. Но (например) с 9-разрядным байт-машиной это может быть 72 бита.

int_fast64_t - это тип данных с не менее чем 64 битами и лучшая арифметическая производительность. Он там в основном для согласованности с int_fast8_t и int_fast16_t, который на многих машинах будет 32 бита, а не 8 или 16. В течение нескольких лет может существовать архитектура, где 128-битная математика быстрее, чем 64-разрядная, но я не Думаю, что кто-то существует сегодня.


Если вы портируете алгоритм, вы, вероятно, захотите использовать int_fast32_t, так как он сохранит любое значение, которое может обрабатывать ваш старый 32-разрядный код, но будет быстрее, чем 64-битный. Если вы конвертируете указатели в целые числа (почему?), Используйте intptr_t.

Ответ 2

int64_t имеет ровно 64 бита. Он не может быть определен для всех платформ.

int_least64_t - наименьший тип с не менее чем 64 битами.

int_fast64_t - это тип, который быстрее всего обрабатывается с не менее 64 бит.

На 32-разрядном или 64-битном процессоре все они будут определены и будут иметь 64 бита. На гипотетическом 73-битном процессоре int64_t не будет определен (поскольку нет типа с ровно 64 битами), а остальные будут иметь 73 бита.