Является ли использование 32-разрядного целого числа разумным?
Возможный дубликат:
Важность использования 16-битного целого
Если сегодня процессоры выполняют (при стандартных условиях) 32-битные операции - тогда используется "короткий int" разумно? Поскольку для выполнения операции над этими данными он преобразует его в 32-разрядное (из 16-разрядного) целое число, выполняет операции, а затем возвращается к 16-битным - я думаю. Итак, в чем смысл?
В сущности, мои вопросы таковы:
- Что (если есть) производительность/помеха производительности с использованием меньшего округления целого числа? Например, если вместо использования стандартного 32-разрядного целого для хранения я использую 16-разрядное короткое целое.
- ", а затем вернуться к 16-битной" - Я исправлю здесь? См. Выше.
- Все ли целые данные хранятся как 32-разрядное целое пространство на CPU/RAM?
Ответы
Ответ 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
только для того, чтобы мне не пришлось выполнять какой-либо модул). Вы также можете использовать конкретные размеры данных для чтения и записи двоичных данных. Там, вероятно, больше, о чем я не упомянул, но вы получите точку =)