Что в действительности означает "натуральный размер" в C++?

Я понимаю, что "натуральный размер" - это ширина целого числа, наиболее эффективно обрабатываемая конкретным оборудованием. Когда используешь short в массиве или в арифметических операциях, short целое число должно быть сначала преобразовано в int,

Q: Что именно определяет этот "натуральный размер"?

Я не ищу простых ответов, таких как

Если он имеет 32-битную архитектуру, его естественный размер - 32-битный

Я хочу понять, почему это наиболее эффективно, и почему short должен быть преобразован перед выполнением арифметических операций над ним.

Бонус Q: Что происходит, когда арифметические операции проводятся на long целое число?

4 ответа

Решение

"натуральный размер" - это ширина целого числа, которая наиболее эффективно обрабатывается определенным оборудованием.

На самом деле, нет. Рассмотрим архитектуру x64. Арифметика на любом размере от 8 до 64 бит будет по существу одинаковой скоростью. Так почему все x64-компиляторы остановились на 32-битном int? Ну, потому что там было много кода, который изначально был написан для 32-битных процессоров, и многие из них неявно полагались на 32-битные целые числа. А учитывая почти бесполезность типа, который может представлять значения до девяти квинтиллионов, дополнительные четыре байта на целое число были бы практически не использованы. Итак, мы решили, что 32-битные целые числа "естественны" для этой 64-битной платформы.

Сравните архитектуру 80286. Всего 16 бит в регистре. Выполнение 32-разрядного целочисленного сложения на такой платформе в основном требует разделения его на два 16-разрядных сложения. Делать с этим практически все, что угодно, - это разделять его на части - и сопутствующее замедление. "Натуральный целочисленный размер" 80286 определенно не 32-битный.

Таким образом, "естественный" сводится к таким соображениям, как эффективность обработки, использование памяти и удобство для программистов. Это не кислотный тест. Это очень вопрос субъективного суждения со стороны разработчика архитектуры / компилятора.

Вообще говоря, каждая компьютерная архитектура спроектирована так, что определенные размеры типов обеспечивают наиболее эффективные числовые операции. Конкретный размер зависит от архитектуры, и компилятор выберет подходящий размер. Более подробные объяснения того, почему разработчики аппаратного обеспечения выбрали определенные размеры для перикулярного аппаратного обеспечения, не будут подходить для stckoverflow.

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

Бонус А: с 5/9 (выражения) мы учимся: Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:

И тогда интерес представляет конкретно:

  • правила с плавающей запятой, которые здесь не имеют значения
  • Otherwise, the integral promotions (4.5) shall be performed on both operands
  • Then, if either operand is unsigned long the other shall be converted to unsigned long.
  • Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted to unsigned long int.
  • Otherwise, if either operand is long, the other shall be converted to long.

Таким образом, компилятор пытается использовать "лучший" тип, который он может делать двоичными операциями, с int будучи наименьшим используемым размером.

Что именно определяет этот "натуральный размер"?

Для некоторых процессоров (например, 32-битного ARM и большинства процессоров в стиле DSP) это определяется архитектурой; регистры процессора имеют определенный размер, и арифметика может быть выполнена только для значений этого размера.

Другие (например, Intel x64) более гибкие, и нет единого "естественного" размера; дизайнеры компилятора должны выбрать размер, компромисс между эффективностью, диапазоном значений и использованием памяти.

почему это наиболее эффективно

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

почему короткое должно быть преобразовано перед выполнением арифметических операций над ним

Предположительно, это было хорошим совпадением с поведением обычно используемых процессоров, когда C разрабатывался полвека назад. C++ унаследовал правила продвижения от C. Я не могу прокомментировать, почему именно это было признано хорошей идеей, поскольку я тогда не родился.

Что происходит, когда арифметические операции проводятся на long целое число?

Если регистры процессора достаточно велики, чтобы содержать long, тогда арифметика будет во многом такой же, как и для int, В противном случае операции должны быть разбиты на несколько операций со значениями, разделенными между несколькими регистрами.

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

Это отличное начало.

Q: Что именно определяет этот "натуральный размер"?

В вышеприведенном абзаце дано определение "натуральный размер". Ничто другое не определяет это.

Я хочу понять, почему это наиболее эффективно

По определению.

и почему короткое должно быть преобразовано перед выполнением арифметических операций над ним.

Это так, потому что определения языка Си говорят так. Нет глубоких архитектурных причин (возможно, некоторые были при изобретении C).

Бонус Q: Что происходит, когда арифметические операции проводятся с длинным целым числом?

Куча электронов устремляется сквозь грязный песок и встречает кучу дырок. (Нет, правда. Задайте смутный вопрос...)

Другие вопросы по тегам