Определение байта в C ++ - PullRequest
2 голосов
/ 01 июля 2010

В http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.6,, что
«Другим подходящим подходом было бы определение« байта »как 9 битов и моделирование символа * двумя словами памяти: первое может указывать на 36-разрядное слово, второе может быть смещением в этом слове. В этом случае компилятору C ++ потребуется добавить дополнительные инструкции при компиляции кода с использованием указателей char *. "

Я не мог понять, что означает "симуляция символа * двумя словами" и дальнейшая цитата.
Может кто-нибудь объяснить это, приведя пример?

Ответы [ 5 ]

3 голосов
/ 01 июля 2010

Я думаю, это то, что они описывали:

У PDP-10, на который есть ссылка во втором абзаце, были 36-битные слова, и он не мог ничего адресовать внутри этих слов.Следующий текст является описанием одного способа, которым эта проблема могла быть решена, вписываясь в ограничения спецификации языка C ++ (которые включены в первый абзац).

Давайте предположим, что вы хотите сделать 9байт (по какой-то причине).По спецификации, char* должен быть в состоянии адресовать отдельные байты.PDP-10 не может этого сделать, потому что он не может адресовать что-либо меньшее, чем 36-битное слово.

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

Визуальная помощь в стиле ASCII:

| Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 |
-------------------------------------------------------------------------
|               Word 1              |               Word 2              |
|              (Address)            |              (Offset)             |
-------------------------------------------------------------------------

Скажем, у вас было char* сword1 = 0x0100 и word2 = 0x12.Это будет указывать на 18-й бит (начало третьего байта) 256-го слова памяти.

Если этот метод действительно использовался для генерации соответствующей реализации C ++ на PDP-10, то компилятор C ++пришлось бы проделать дополнительную работу с манипулированием дополнительными битами, необходимыми для этого довольно прикольного внутреннего формата.

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

3 голосов
/ 01 июля 2010

Поскольку спецификация C ++ говорит, что char* должен указывать на отдельные байты, а PDP-6/10 не позволяет адресовать отдельные байты в слове, у вас есть проблема с char* (который является указателем байта) на PDP-6/10

Итак, можно обойти это: определите байт как 9 битов, тогда у вас по существу будет 4 байта в слове (4 * 9 = 36 bits = 1 word).

Вы все еще не можете указать char* на отдельные байты в PDP-6/10, поэтому вместо этого char* должен состоять из 2 36-битных слов.Нижнее слово будет фактическим адресом, а верхнее слово будет магией байтовой маски, которую компилятор C ++ может использовать для указания правильных 9 бит в нижнем слове.

В этом случае

sizeof(*int) (36 бит) отличается от sizeof(*char) (72 бит).

Это просто надуманный пример, который показывает, как спецификация не ограничивает примитивы конкретными размерами бит / байт.

1 голос
/ 01 июля 2010
data: [char1|char2|char3|char4]

Для доступа к char1:

ptrToChar = &data
index = 0

Для доступа к char2:

ptrToChar = &data
index = 9

Для доступа к char3:

ptrToChar = &data
index = 18

...

затем, чтобы получить доступ к персонажу, вы должны:

(*ptrToChar >> index) & 0x001ff

но ptrToChar и index будут сохранены в некоторой структуре, которую создает компилятор, чтобы они были связаны друг с другом.

0 голосов
/ 22 января 2019

На самом деле, PDP-10 может адрес (загружать, хранить) «байтов», меньше, чем (36-битное) слово, с указателем одного слова. На th-10 указатель байта включает в себя адрес слова, содержащий «байт», ширину (в битах) «байта» и позицию (в битах справа) «байта» в слове. Увеличивая указатель (с явным приращением, или инструкцией приращения и загрузки / внесения), увеличивает часть позиции (на часть размера) и обрабатывает переполнение до следующего адреса слова. (Не уменьшая, хотя.) Байтовый указатель может, например, адресовать отдельные биты, но 6, 8, 9, 18 (!), вероятно, были обычными, поскольку были специально отформатированные версии байтовых указателей (глобальных байтовых указателей), которые несколько облегчали их использование.

0 голосов
/ 01 июля 2010

Предположим, реализация PDP-10 хотела получить как можно ближе к 8-битным байтам, насколько это возможно.Наиболее разумным разделить 36-битное слово (наименьшая единица памяти, которую может адресовать язык сборки машины) - это разделить слово на четыре 9-битных байта.Чтобы получить доступ к определенному 9-битному байту, вам нужно знать, в каком слове оно находится (для этого вы будете использовать собственный режим адресации машины, используя указатель, который занимает одно слово), и вам понадобятся дополнительные данные, чтобы указатьиз 4 байтов внутри слова был тот, который вас заинтересовал.Эти дополнительные данные будут храниться во втором машинном слове.Компилятор сгенерирует множество дополнительных инструкций, чтобы использовать эти дополнительные данные для извлечения правильного байта из слова, используя дополнительные данные, хранящиеся во втором слове.

...