Размер int зависит от компилятора и/или процессора?

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Спасибо

Ответ 7

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

Ответ 8

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

Ответ 10

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

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