почему значение адреса в cs всегда четное? - PullRequest
1 голос
/ 14 октября 2019

Почему значение адреса в C и C ++ всегда четное? Например: я объявляю переменную int x, а x имеет адрес памяти 0x6ffe1c (в шестнадцатеричном формате). Не важно что. Это значение никогда не является нечетным числом, это всегда четное число. Почему это так?

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Компьютерная память состоит из битов. Биты организованы в группы. Компьютер может иметь гигабайт памяти, превышающий 1 000 000 000 байтов или 8 000 000 000 бит, но физические соединения с памятью не могут просто получить какой-либо конкретный бит из этой памяти.

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

Давайте продолжим на примере 32-битных слов. Поскольку память сгруппирована в слова из 32 битов, каждое слово имеет адрес памяти, кратный 32 битам или четырем байтам. И каждый адрес, кратный четырем (0, 4, 8, 12, 16,… 4096, 4100, 4104,…), является адресом слова. Процессор всегда читает или записывает память в единицах слов - это единственное взаимодействие, которое может выполнять аппаратное обеспечение;процессор не может прочитать отдельные байты из памяти. Если ваш int в одном слове, то процессор может получить его из памяти, запросив это слово.

С другой стороны, предположим, что ваш int начинается с адреса 99. Затем один байтэто слово начинается с адреса 96 (адреса с 96 по 99), и три байта этого слова находятся в слове, которое начинается с адреса 100 (адреса со 100 по 103). Чтобы получить int, процессор должен прочитать два слова, а затем соединить из них байты, чтобы получить одно int.

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

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

1 голос
/ 14 октября 2019

Почему значение адреса в C и C ++ всегда четное?

В общем случае это не так. Например, если у вас есть массив char[2], вы обнаружите, что ровно один из этих элементов имеет четный адрес, а другой должен иметь нечетный адрес.

Я объявляю переменную intx и x имеют адрес памяти 0x6ffe1c

Каждый тип в C и C ++ имеет некоторые выравнивание требование. То есть объекты типа должны храниться по адресу, который делится этим выравниванием. Требование выравнивания - это целое число, которое всегда является степенью двойки.

Существует ровно одна степень двойки, которая не является четной: 2 0 == 1. Объекты с требованием выравнивания 1может храниться в нечетных адресах. char всегда имеет размер и выравнивание в 1 байт. int обычно предъявляет более высокие требования к выравниванию, и в этом случае оно будет храниться по четному адресу.

Причина, по которой выравнивание важно, состоит в том, что существуют наборы команд ЦП, которые позволяют только чтение и запись в адреса памяти, которыевыровнены по ширине CPU word . Другие наборы команд ЦП могут поддерживать операции с адресами, выровненными по некоторым долям размера слова. Кроме того, некоторые наборы команд ЦП, такие как поддержка x86, работают с полностью невыровненным адресом, но (по крайней мере, на старых моделях) такие операции могут быть намного медленнее.

...