2014-09-15 5 views
0

Я пишу набор чистых виртуальных классов, которые действуют как интерфейсы. Идея состоит в том, что код, реализующий такие интерфейсы, может быть построен с другой конфигурацией сборки, компилятором или даже другой реализацией STL для использования кода таким объектом через такой интерфейс.Насколько согласован размер std :: size_t

Обычные старые данные, такие как uint32_t, стандартизированы как double и float. (bool нет, поскольку в стандарте не указаны его размеры.)

В какой категории std::size_t? Является ли это чисто функцией архитектуры машины? Например, на 32-битной машине, может ли быть так, что sizeof(std::size_t) не 4?

+6

В стандарте не указаны размеры 'double' и' float'. –

+0

Я, хотя он сделал * эффективно *, заявив, что это IEEE 32 и 64-битные типы с плавающей запятой. Возможно, я стану 'static_assert', чтобы квалифицировать свое предположение. –

+0

Стандарт не требует, чтобы 'double' и' float' были типами с плавающей точкой IEEE. Если потребовалось, чтобы 'numeric_limits :: is_iec559' было бы лишним, потому что оно всегда было бы правдой. –

ответ

4

size_t требуется только для того, чтобы быть неподписанным и достаточно большим, чтобы содержать размер любого объекта в байтах, поэтому в зависимости от его размера он не переносится. Это предусмотрено в проекте C++ стандартной секции 18.2Типы, который говорит:

Тип size_t является реализация определенных беззнаковое целое число типа , что является достаточно большим, чтобы содержать размер в байтах любого объекта.

Для целых чисел, если вам нужна определенная ширина, вам необходимо использовать типы, определенные в cstdint header.

Обратите внимание, стандарт не определяет размер поплавка и двойной, они не должны быть IEEE 754 числа с плавающей точкой.

+0

+1 Большое спасибо, в частности за цитирование стандарта. Это сделает полезный комментарий программы, чтобы мой босс был счастлив. –

2

На самом деле, ни double, ни float не имеют стандартизованных размеров. Фактически, единственными типами являются типы (u) intNN_t, и они могут не существовать.

Таким образом, необходимая документация не является стандартом, это документация целевого компилятора.

Но с целью обеспечения стабильности среди компиляторов, версий компилятора, конфигураций компоновки и стандартных библиотек, довольно безопасно предположить, что на любой данной платформе std::size_t имеет согласованный размер. Обратите внимание, однако, что 32-битные и 64-битные сборки - это разные платформы.

Смежные вопросы