Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Что влияет на количество памяти занимаемой разными типами данных

#cpp #x64 #integer


Как я понимаю, обычно тип integer весит 4 байта, в том числе и unsigned integer. 
Но есть случаи где в зависимости от разрядности процессора integer может иметь как
2 байта так и 8. 
Не понимаю, как разрядность влияет на размер целочисленного типа и что это меняет
для разработчика кроме того, что в него можно вместить шире диапазон чисел(или меньший)?

UPD

Что значить переводить программу из x32 в x64? Грубо говоря, это использования типов
x64? Если я правильно понимаю, причина по которой программа написанная под x64 не будет
работать на x32, это оверхед по память в типах данных? 
Почему тогда мы можем допустим в Visual Studio выбрать под какую разрядность делать
build? Как это будет влиять на размер самой программы и размер, который будут забирать
обычные типы данных? 
    


Ответы

Ответ 1



Есть такая таблица соответствия размеров фундаментальных типов в зависимости от используемой модели данных: Модель данных в общем случае не привязана непосредственно к железу (разрядности процессора), и зависит от используемой операционной системы (если она присутствует). При этом должно быть очевидно, что на 32bit процессоре не удастся запустить 64bit ОС, но обратное вполне себе имеет место быть. Размер фундаментальных типов в конкретной реализации компилятора (т.е. под конкретную платформу) подбирается так, чтобы обеспечивать оптимальную производительность. Помимо увеличения диапазона значений фундаментальных типов, бОльшая разрядность позволяет адресовать больше памяти. Например, при 32bit можно адресовать не более 4Gb, а при 64bit уже 16Eb. Когда говорят о переводе программы с x32 на x64 имеют в виду, что должна обеспечиваться в первую очередь работоспособность программы в 64bit окружении. Т.е. что из-за изменения размеров типов ничего не сломается. Такого рода проблемы часто возникают, когда при первичной разработке закладываются на фиксированный размер фундаментальных типов, например, что указатель всегда будет 4 байта. А когда при сборке в 64bit режиме он "вдруг" становится в 2 раза больше программа просто начинает крашиться. Поэтому, чтобы программа была переносима между x32 ↔ x64 при необходимости обеспечить нужную разрядность вычислений стоит полагаться на типы из .

Ответ 2



Чтобы это понять, лучше написать пару программ на ассемблере, например простейший калькулятор. Основная причина разных размеров типа int, обычно кроется в количестве байт машинного слова архитектуры процессора (т.е. размер регистров), а также непосредственно в компиляторе. Обычно представление следующее: 8 бит int = 16 бит 16 бит int = 16 бит 32 бит int = 32 бита 64 бит int = 32 бита Необходимость 64 разрядных операционных систем и как следствие использования архитектур процессора возникла из-за роста памяти. Дело в том, что 32 разрядная ОС позволяет адресовать только 4 гигабайта оперативной памяти, т.к. 2^32 = 4294967296 байт. Регистры процессора архитектуры x86 AL, BL, CL, DL - 8 бит AX, BX, CX, DX - 16 бит EAX, EBX, ECX, EDX - 32 бит

Комментариев нет:

Отправить комментарий