Подтвердить что ты не робот

Является ли использование 32-разрядного целого числа разумным?

Возможный дубликат:
Важность использования 16-битного целого

Если сегодня процессоры выполняют (при стандартных условиях) 32-битные операции - тогда используется "короткий int" разумно? Поскольку для выполнения операции над этими данными он преобразует его в 32-разрядное (из 16-разрядного) целое число, выполняет операции, а затем возвращается к 16-битным - я думаю. Итак, в чем смысл?

В сущности, мои вопросы таковы:

  • Что (если есть) производительность/помеха производительности с использованием меньшего округления целого числа? Например, если вместо использования стандартного 32-разрядного целого для хранения я использую 16-разрядное короткое целое.
  • ", а затем вернуться к 16-битной" - Я исправлю здесь? См. Выше.
  • Все ли целые данные хранятся как 32-разрядное целое пространство на CPU/RAM?
4b9b3361

Ответ 1

  • Процессору не нужно "расширять" значение для работы с ним. Он просто заполняет неиспользуемые пробелы нулями и игнорирует их при выполнении вычислений. Таким образом, на самом деле быстрее работать с short int, чем long int, хотя с сегодняшними быстрыми процессорами очень сложно заметить даже немного разницу (каламбур).

  • Машина действительно не конвертируется. При изменении размера значения он либо устанавливает нули влево, либо полностью игнорирует дополнительные биты влево, которые не помещаются в область целевой памяти.

  • Нет, и обычно это причина, по которой люди используют значения short int для целей, когда диапазон a long int просто не нужен. Выделенная память различна для каждой длины int, например, short int занимает меньше бит памяти, чем long int. Одним из шагов оптимизации является изменение значений long int до значений short int, когда диапазон не превышает значение short int, что означает, что значение никогда не будет использовать дополнительные биты, выделенные с помощью long int. Память, сохраненная от такой оптимизации, может быть весьма значительной при работе с множеством элементов в массивах или множеством объектов одного и того же struct или class.

Различные размеры int сохраняются с разным количеством бит как в ОЗУ, так и в кеше внутреннего процессора. Это также относится к float, double и long double, хотя long double в основном относится к 64-битным системам, и большинство компиляторов просто игнорируют long, если они работают на 32-битных машинах, потому что 64-разрядные значение в 32-разрядном аккумуляторе и ALU будут "скошены" во время любых вычислений и, вероятно, никогда не получат ничего, кроме нулей для первых 32 бит.

Ответ 2

Ответ на ваш первый вопрос также должен прояснить последний: если вам нужно хранить большое количество 16-разрядных int s, вы сохраняете половину объема памяти, необходимого для 32-разрядных int s, с любые "дополнительные преимущества", которые могут возникнуть вместе с ним, например, более эффективно использовать кеш.

В настоящее время большинство процессоров имеют отдельные инструкции для 16-разрядных и 32-разрядных операций, а также инструкции по чтению и записи 16-битных значений из и в память. Внутренне ALU может выполнять 32-битную операцию, но результат для верхней половины не возвращает его в регистры.

Ответ 3

Что (если есть) производительность/помеха производительности с использованием меньшего диапазона целого числа? Например, если вместо использования стандартного 32-разрядного целого для хранения я использую 16-разрядное короткое целое.

Он использует меньше памяти. При нормальных обстоятельствах он будет использовать в два раза меньше.

", а затем вернуться к 16-битной" - Я исправлю здесь? См. Выше.

Он преобразует только 16-разрядный 32-разрядный код, если это необходимо вашему коду, который вы не смогли показать.

Все ли целые данные хранятся как 32-разрядное целое пространство на CPU/RAM?

Нет. 32-разрядные процессоры могут напрямую обращаться и работать со значениями до 32 бит. Многие операции могут выполняться также с 8 и 16-разрядными значениями.

Ответ 4

Нет, не разумно, если у вас есть какие-то (очень жесткие) ограничения памяти, которые вы должны использовать int

  • Вы не получаете производительности, просто память. На самом деле вы теряете производительность из-за того, что вы только что сказали, поскольку регистры должны выделять верхние биты.
  • См. выше
  • Да зависит от процессора, Нет 16 бит в ОЗУ.

Ответ 5

Что (если есть), то усиление/помеха производительности с использованием меньшего диапазона целое принести? Например, если вместо использования стандартного 32-битного целого для Я использую 16-разрядное короткое целое.

Производительность исходит из локальности кэша. Чем больше данных вы вписываете в кеш, тем быстрее выполняется ваша программа. Это более актуально, если у вас много значений short.

", а затем вернитесь к 16-бит" - Я исправлю здесь?

Я не уверен в этом. Я бы ожидал, что процессор может оптимизировать несколько операций параллельно, и вы получите большую пропускную способность, если сможете упаковать данные в 16 бит. Также может случиться, что это может произойти одновременно с другими 32-битными операциями. Я размышляю здесь, поэтому я остановлюсь!

Все ли целые данные хранятся как 32-разрядное целое пространство на CPU/RAM?

Нет. Различные целые типы данных имеют определенный размер. Однако при использовании char и short, в частности, вы можете столкнуться с внутренними структурами.


Эффективность скорости - это не единственная проблема. Очевидно, что у вас есть преимущества для хранения, а также внутреннее поведение (например, я написал код, специфичный для производительности, который использует переполнение целого числа unsigned short только для того, чтобы мне не пришлось выполнять какой-либо модул). Вы также можете использовать конкретные размеры данных для чтения и записи двоичных данных. Там, вероятно, больше, о чем я не упомянул, но вы получите точку =)