Почему размер int различается в некоторых компиляторах? [Дубликат]

0

Читая следующий ресурс, он говорит, что размер int/pointer может варьироваться в зависимости от компилятора:

http://www.c4learn.com/c-programming/c-size-of-pointer-variable/

Почему это?

Я понимаю, что C определяет только минимальное и максимальное количество того, что должен хранить тип, но почему один компилятор решил установить, например, int на 2 байта, а другой на 4? Каким будет преимущество одного над другим?

  • 2
    другая архитектура имеет различное собственное целое число, например, если компилятор по умолчанию использует 64-битное целое число, вы можете пострадать от 32-битных целей, которые требуют эмулированной арифметики.
Теги:
architecture
int

2 ответа

6
Лучший ответ

Хотя на "почему" можно ответить "Поскольку стандарт говорит так", можно было бы утверждать, что стандарт может быть написан по-разному, чтобы гарантировать определенный размер.

Однако цель C и C++ - создать очень быстрый код на всех машинах. Если компилятор должен был убедиться, что int является "неестественным размером" для этой машины, для этого потребуются дополнительные инструкции. Для почти всех обстоятельств это не требуется, все, о чем вы заботитесь, это то, что он "достаточно большой для того, что я хочу делать". Таким образом, чтобы дать компилятору хорошую возможность генерировать "хороший код", стандарт определяет только минимальные размеры, избегая того, чтобы компилятор должен был генерировать "дополнительный код", чтобы заставить int (и другие типы) вести себя очень определенным образом.

Одним из преимуществ C и C++ является то, что компиляторы нацелены на широкий спектр машин: от небольших 8- и 16-битных микроконтроллеров до больших 64-битных многоядерных процессоров, таких как ПК, И, конечно, некоторые 18, 24 или 36-битные машины тоже. Если ваш компьютер имеет 36-битный собственный размер, вы не будете очень счастливы, если, поскольку в некоторых стандартах так говорится, вы получаете половину производительности в математике по целому ряду из-за дополнительных инструкций и не можете использовать верхние 4 бита int...

Небольшой микропроцессор с битовыми регистрами 8- часто поддерживает поддержку 16-битных дополнений и вычитаний (и, возможно, также умножение и деление), но математика 32- будет включать удвоение этих инструкций [и больше работы по умножению и делению ]. Таким образом, 16-разрядные целые числа (2 байта) будут иметь гораздо больше смысла на таком маленьком процессоре, особенно потому, что память, вероятно, тоже не очень большая, поэтому сохранение 4 байта для каждого целого является небольшим количеством отходов. В 32- или 64-битной машине диапазон памяти, скорее всего, намного больше, поэтому с большими целыми числами это не так много недостатка, а 32- битовые целые операции имеют ту же скорость, что и меньшие (и в в некоторых случаях "лучше" - например, в x86, для 16-разрядной простой математической операции, такой как сложение или вычитание, требуется дополнительный префиксный байт, чтобы сказать "сделать этот 16-разрядный", поэтому математика по 16-разрядным целым заняла бы больше кода -пространство).

1

Потому что стандарт C говорит:

(C99, 6.2.5p5) "Объект" plain "int имеет естественный размер, предложенный архитектурой среды исполнения"

C определяет только минимальное значение для максимального значения, INT_MAX может удерживать int (INT_MAX), максимальное значение для минимального значения, которое может удерживать int (INT_MIN).

  • 0
    В C99 <stdint.h> определяет типы с точной шириной (и более). например, int32_t, uint64_t и т. д.
  • 1
    Фактически, <stdint.h> определяет эти типы, ЕСЛИ они возможны на машине. Существует также int_least32_t , который гарантирует, что он должен быть не менее 32 бит, но не дает гарантии более int_least32_t размера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню