Размер int зависит от компилятора и / или процессора? - PullRequest
66 голосов
/ 25 февраля 2010

Будет ли размер целого числа зависеть от компилятора, ОС и процессора?

Ответы [ 10 ]

117 голосов
/ 25 февраля 2010

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

В конечном счете, теоретически все в C и C ++ зависит от компилятора и только от компилятора. Оборудование / ОС не имеет никакого значения вообще. Компилятор может бесплатно реализовать слой аппаратной абстракции любой толщины и эмулировать абсолютно все. Ничто не мешает реализации на C или C ++ реализовать тип int любого размера и с любым представлением, если он достаточно велик, чтобы соответствовать минимальным требованиям, указанным в стандарте языка. Практические примеры такого уровня абстракции легко доступны, например, языки программирования на основе платформы «виртуальная машина», например Java.

Однако C и C ++ предназначены для очень эффективных языков. Для достижения максимальной эффективности реализация C или C ++ должна учитывать определенные соображения, вытекающие из базового оборудования. По этой причине имеет смысл убедиться, что каждый базовый тип основан на некотором представлении, которое напрямую (или почти напрямую) поддерживается аппаратным обеспечением. В этом смысле размер базовых типов зависит от аппаратного обеспечения.

Другими словами, конкретная реализация C или C ++ для 64-битной аппаратной / операционной платформы абсолютно бесплатна для реализации int как 71-битный целочисленный тип со знаком 1 и дополнением со знаком, который занимает 128 бит памяти, используя другие 57 битов - биты заполнения, которые всегда требуются для хранения даты рождения подруги автора компилятора. Эта реализация даже будет иметь определенное практическое значение: ее можно использовать для выполнения тестов переносимости программ на C / C ++ во время выполнения. Но на этом практическая полезность этой реализации заканчивается. Не ожидайте увидеть что-то подобное в «нормальном» компиляторе C / C ++.

32 голосов
/ 25 февраля 2010

Да, это зависит как от процессоров (в частности, от ISA, архитектуры набора команд, например, x86 и x86-64), так и от компиляторов, включая модель программирования. Например, в 16-битных машинах размер (int) составлял 2 байта. 32-битные машины имеют 4 байта для int. Считалось, что int был собственным размером процессора, то есть размером регистра. Однако 32-разрядные компьютеры были очень популярны, и для 32-разрядной модели программирования было написано огромное количество программного обеспечения. Таким образом, было бы очень странно, если бы 64-битный компьютер имел бы 8 байтов для int. И Linux, и Windows остаются 4 байта для int. Но они различаются по размеру long.

Посмотрите на 64-битную модель программирования, такую ​​как LP64 для большинства * nix и LLP64 для Windows:

Такие различия на самом деле довольно смущают, когда вы пишете код, который должен работать как в Windows, так и в Linux. Поэтому я всегда использую int32_t или int64_t, а не long, через stdint.h .

7 голосов
/ 25 февраля 2010

Да, было бы. Они имели в виду «от чего бы это зависело: от компилятора или процессора»? В этом случае ответ в основном «оба». Обычно int не будет больше, чем регистр процессора (если он не меньше 16 бит), но он может быть меньше (например, 32-битный компилятор, работающий на 64-битном процессоре). Как правило, однако, вам потребуется 64-битный процессор для запуска кода с 64-битным int.

6 голосов
/ 11 июля 2012

Основываясь на некоторых недавних исследованиях, которые я проводил, готовясь к собеседованиям по прошивке:

Наиболее значительное влияние битовой архитектуры процессоров, т. Е. 8-битной, 16-битной, 32-битной, 64-битной, - это то, как вам нужно наиболее эффективно хранить каждый байт информации для наилучшего вычисления переменных за минимальное количество циклов.

Размер в битах вашего процессора говорит вам, какую длину слова процессор может обработать за один цикл. 32-битному компьютеру требуется 2 цикла для обработки 64-битного двойного кода, если он правильно выровнен в памяти. Большинство персональных компьютеров были и остаются 32-битными, поэтому это наиболее вероятная причина типичного сходства компилятора C для 32-битных целых чисел с опциями для больших чисел с плавающей запятой и длинных длинных целых.

Очевидно, что вы можете вычислять переменные большего размера, поэтому в этом смысле битовая архитектура ЦП определяет, как ему придется хранить большие и меньшие переменные для достижения максимально возможной эффективности обработки, но это никоим образом не является ограничивающим фактором в определениях. размеров байтов для ints или char, которые являются частью компиляторов и что продиктовано соглашением или стандартами.

Я нашел этот сайт очень полезным, http://www.geeksforgeeks.org/archives/9705, для объяснения того, как естественная длина слова ЦП влияет на то, как он будет хранить и обрабатывать большие и меньшие типы переменных, особенно в отношении упаковки битов в структуры. Вы должны быть очень осведомлены о том, как вы решили назначать переменные, потому что большие переменные должны быть выровнены в памяти, чтобы они занимали наименьшее количество циклов при делении на длину слова процессора. Это добавит много потенциально ненужного буфера / пустого пространства к таким вещам, как структуры, если вы плохо упорядочите присваивание ваших переменных.

2 голосов
/ 09 сентября 2014

Простой и правильный ответ заключается в том, что это зависит от компилятора. Это не означает, что архитектура не имеет значения, но с этим справляется компилятор, а не ваше приложение. Можно было бы сказать более точно, что это зависит от (целевой) архитектуры компилятора, например, если он 32-битный или 64-битный.

Предположим, у вас есть приложение Windows, которое создает файл, в который записывает int плюс другие вещи, и читает его обратно. Что произойдет, если вы запустите это как на 32-битных, так и на 64-битных окнах? Что произойдет, если вы скопируете файл, созданный в 32-битной системе, и откроете его в 64-битной системе?

Вы можете подумать, что размер int будет отличаться в каждом файле, но нет, они будут одинаковыми, и в этом суть вопроса. Вы выбираете настройки в компиляторе для 32-битной или 64-битной архитектуры, и это все диктует.

0 голосов
/ 20 апреля 2015

http://www.agner.org/optimize/calling_conventions.pdf

«3 Представление данных» содержит хороший обзор того, что делают компиляторы с целочисленными типами.

0 голосов
/ 25 января 2015

размер типа данных в основном зависит от типа компилятора, а компиляторы разрабатываются на основе архитектуры процессоров, поэтому внешний тип данных можно считать зависимым от компилятора. Например, размер целого числа составляет 2 байта в 16-битном компиляторе но 4 байта в компиляторе gcc, хотя они выполняются в одном процессоре

0 голосов
/ 01 марта 2011

Размер int равен длине слова, которая зависит от базового ISA. Процессор - это аппаратная реализация ISA, а компилятор - программная реализация ISA. Все вращается вокруг основного ISA. В наши дни самым популярным ISA является Intel IA-32. длина слова 32 бита или 4 байта. 4 байта могут быть максимальным размером компиляторов int (просто int, а не short или long). на основе IA-32, можно использовать.

0 голосов
/ 25 февраля 2010

Размер типов данных зависит от процессора, потому что компилятор хочет облегчить доступ процессора к следующему байту. например: если процессор 32-битный, компилятор не может выбрать размер int как 2 байта [который он должен был выбрать 4 байта], потому что для доступа к другим 2 байтам этого int (4 байта) потребуется дополнительный цикл ЦП, который является пустой тратой. Если компилятор выбирает int как 4 байта, CPU может получить доступ к полному 4 байту за один кадр, что ускоряет ваше приложение.

Спасибо

0 голосов
/ 25 февраля 2010

Да, я обнаружил, что размер int в turbo C составлял 2 байта, а в компиляторе MSVC - 4 байта.

В основном размер int равен размеру регистров процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...