Может ли C справиться с суббайтовой адресацией инструкции? - PullRequest
0 голосов
/ 14 февраля 2020

Например, если архитектура поддерживает инструкции длины клочка, но данные выровнены по байту, будет ли:

void *PointerToAnything;

работать? Другими словами, может ли компилятор справиться с этим?

1 Ответ

4 голосов
/ 14 февраля 2020

В C невозможно получить доступ к элементам данных в единицах, меньших 8 бит, так как наименьший возможный тип - char, который имеет CHAR_BIT бит, что по меньшей мере 8. Битовые поля являются исключением, но не допускают указателей на их члены; указатель данных с суб- (8-) байтовой точностью не может существовать в C.

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

Даже на платформах с размером как минимум байтовых инструкций & выравнивание, указатели функций и указатели данных могут не быть взаимозаменяемыми, поскольку указатели функций могут быть больше или меньше указателей данных (представьте себе систему с 256 байтами ОЗУ для данных и 64 КБ fla sh байтов для памяти программ). Следовательно, C не гарантирует, что void* может указывать на все. Однако некоторые платформы, такие как POSIX do , явно разрешают это, например, для работы dlsym().

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