Вопрос по c++ – Точные значения ширины в C ++ / Qt: действительно ли typedef int qint32 действительно корректен?

2

Документация Qt гласит:

typedef qint8

Typedef for signed char. This type is guaranteed to be 8-bit on all platforms supported by Qt.

typedef qint16

Typedef for signed short. This type is guaranteed to be 16-bit on all platforms supported by Qt.

typedef qint32

Typedef for signed int. This type is guaranteed to be 32-bit on all platforms supported by Qt.

typedef qint64

Typedef for long long int (__int64 on Windows). This type is guaranteed to be 64-bit on all platforms supported by Qt.

Типы определены вqglobal.h следующее:

/*
   Size-dependent types (architechture-dependent byte order)
   Make sure to update QMetaType when changing these typedefs
*/
typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
//....

Но мне интересно, как (например)qint32 всегда может быть длиной 32 бита, если нет гарантии, чтоint длиной 32 бита.As far as I know, on 64-bit architectures ints are (or at least can be) 64 bits long. [Редактировать: я был не прав. Смотрите комментарии ниже.]

Как они могут гарантировать размеры? Почему они не используютstdint (и __intN на платформах Windows)?

Да, но Qt также поддерживает 64-битные платформы. leemes
@leemes -int все еще 32 бит на этих платформах. Ноlong может отличаться Bo Persson
@ BoPersson Хорошо, спасибо, я этого не знал. Извините меня немного не по теме вопрос: на 64-битных платформах, этоint так же быстро, как 64-битныйlong? leemes
Это не обязательно должно работать на всех платформах, только на всех платформах, поддерживаемых Qt. n.m.
@leemes - на платформах Qt поддерживает (x86-64?)int операция на байт короче и использует меньше данных, чем 64-битное значение. Это может сделать это быстрее. С другой стороны, 64-битная операционная система обрабатывает вдвое больше данных,should you need that. Bo Persson

Ваш Ответ

2   ответа
1

но важна 64-битная модель данных платформы (или, возможно, более правильно, модель данных компилятора и платформы).

Наиболее распространенные 64-разрядные платформы используют 32-разрядные целые числа, поскольку они реализуют некоторую форму модели данных LP64. Модели данных на основе ILP64 (ILP64, SILP64 и т. Д.) Определяют целые числа как 64-битные. Но я не верю, что Qt поддерживает любое из этихплатформы.

ПроверьтеILP64 вики-страница и этостраница поддержки для PVS-Studio у этого есть некоторая хорошая техническая информация.

3

Они ориентированы на конкретные платформы, которые, как они знают, работают вышеупомянутые определения. Qt не заботится о других платформах идругие платформы не волнует Qt. Таким образом, это не всегда работает. Но там, где это не сработает, Qt.

Why don't they use stdint (and __intN on windows platforms)?

Иногда проще поддерживать typedef в<stdint.h> для вашего собственного проекта, а не условно включая стандартный заголовок на платформах, которые его имеютand все еще сохраняя запасной вариант для платформ, которые этого не делают (например, VS2005).

Похожие вопросы