Можно ли хранить указатель с двумя нулевыми байтами высшего порядка как WORD, когда его нет в регистре процессора? - PullRequest
0 голосов
/ 04 ноября 2010

В системе, где размер указателя составляет 4 байта, когда целью является просто адресация частей памяти, которые могут быть адресованы двумя байтами (нижними частями), возможно ли сохранить указатель как двухбайтовое СЛОВО, когда это в каком регистре процессора? Я не вижу никакой причины, если предположить, что у нас есть какое-то слово типа "twoBytes", объявив указатель вроде:

char * pointer = reinterpret_cast<char *>((unsigned int)(twoBytes))

Мы представляем совершенно новый объект с 4 байтами, который будет сохранен как объект с 4 байтами.

Ответы [ 4 ]

3 голосов
/ 04 ноября 2010

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

Однако, например, в Windows вы можете быть уверены только в том, что верхнее слово 32-битного указателя для пользовательского кода не ноль (за исключением нулевых указателей).Это подразумевается в макросах Windows API, таких как MAKEINTATOM .Если самым значимым словом может быть ноль, то API-интерфейсы не смогут надежно отличить указатели, представляющие маленькие целые числа, от указателей до текстовых строк.

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

Приветствия & hth.,

2 голосов
/ 04 ноября 2010

То, что вы описываете, звучит больше как функция компилятора (старые добрые "ближние" указатели), чем что-то, что вы можете сделать изнутри языка.Обсудите это с тем, кто сделал компилятор, который вы используете.Я могу ручаться за теоретическую возможность возможности реализовать это поведение в GCC, хотя я подозреваю, что это будет огромной болью в заднице.

Как альтернативный хак, вы можетевозможность получить большую часть того, что вы хотите, используя базовый указатель и смещения «без знака».

1 голос
/ 04 ноября 2010

Вы также можете использовать его без именованного 4-байтового объекта:

((char*)(unsigned)twoBytes)[idx] = some_val;

twoBytes займет только два байта в памяти. Когда вы преобразуете его в char *, ваш компилятор создаст 4-байтовое значение для фактического обращения к данным, но вы никогда не увидите его, и, скорее всего, оно будет только в регистре. Я думаю, это то, что вы спрашивали.

1 голос
/ 04 ноября 2010

Нет, по той же причине вы не можете хранить слово «велосипед» в двух байтах. Данные просто не подходят. Не приводите указатели к типам без указателей, они часто непереносимы и могут молча вводить усечение и вызывать некоторые неприятные ошибки.

...