Действительно ли все указатели данных являются тем же размером в одной платформе для всех типов данных?

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

46
задан Ciro Santilli 新疆改造中心法轮功六四事件 26 June 2015 в 20:29
поделиться

8 ответов

Они не гарантированно будет того же размера, хотя на платформах, с которыми у меня есть опыт, они обычно есть.

C 2011 онлайн-проект :

6.2. 28 Указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа. 48) Точно так же указатели на квалифицированные или неквалифицированные версии совместимые типы должны иметь одинаковые требования к представлению и согласованию. Все указатели на структурные типы должны иметь одинаковые требования к представлению и выравниванию как друг друга. Все указатели на типы объединения должны иметь одинаковое представление и требования согласования друг с другом. Указатели на другие типы не обязательно должны иметь то же самое требования к представлению или согласованию.
48) Те же требования к представлению и выравниванию подразумевают взаимозаменяемость, поскольку аргументы функций, возвращаемые значения из функций и члены объединений.
50
ответ дан 26 November 2019 в 20:23
поделиться

Не обязательно. Стандарт не гарантирует sizeof (double *) == sizeof (int *) . Например, предположим, что процессор с двумя адресными шинами с разной шириной (как на некоторых процессорах с архитектурой Гарварда) может иметь указатели разных размеров.

18
ответ дан 26 November 2019 в 20:23
поделиться

На 16-битных встроенных процессорах, которые имеют (выгружаемую) RAM и / или флэш-память, использование страниц может привести к тому, что указатели будут иметь разные размеры - хотя это не зависит от размера данных они указывают на.

Например, на процессоре Freescale HCS12, который имеет банковскую флэш-память, все указатели данных являются 16-битными.

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

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

Возможно, что 16-битный процессор с ОЗУ с банками также будет иметь разные размеры для ближних и дальних указателей данных.

7
ответ дан 26 November 2019 в 20:23
поделиться

Обратите внимание на то, что говорится в стандарте C - цитируемом Джоном Боде. Также обратите внимание, что стандарт C вообще ничего не говорит о размерах указателей на функции.

Стандарт POSIX устанавливает некоторые дополнительные требования:

2.12.3 Типы указателей

Все типы указателей функций должны иметь то же представление, что и указатель типа на void. Преобразование указателя функции в void * не должно изменять представление. Значение void *, полученное в результате такого преобразования, может быть преобразовано обратно в исходный тип указателя функции с использованием явного преобразования без потери информации.

Примечание: стандарт ISO C не требует этого, но он требуется для POSIX соответствие.

7
ответ дан 26 November 2019 в 20:23
поделиться

Нет такой гарантии ни в стандартах ISO C, ни в C ++, но на практике я еще не видел платформы, где это не не выполняется.

Обратите внимание, что независимо от этого, reinterpret_cast 'один указатель на другой чаще всего приводит к UB, за некоторыми исключениями ( void * и unsigned char * для POD). Как и любые уловки профсоюзов. Возникает очевидный вопрос: а какое вам дело?

4
ответ дан 26 November 2019 в 20:23
поделиться

При программировании реального режима x86 с помощью Watcom C у вас может быть смешанная модель памяти, использующая 16-битные ближние указатели и 32-битные дальние указатели.

4
ответ дан 26 November 2019 в 20:23
поделиться

В защищенном режиме DOS days указатель функции и указатель данных могут иметь разную длину, поскольку данные могут находиться в другом разделе.

2
ответ дан 26 November 2019 в 20:23
поделиться

Как правило, да, все указатели на что-либо, независимо от того, указывают ли они на int, long, строку, массив строк или функцию, указывают на один адрес памяти, который является одним и тем же размер на машине. Это связано с тем, что обработчик на машине имеет адресный регистр, в который загружаются эти указатели, и размер этого адресного регистра определяет размер указателей.

Единственное исключение может быть в случаях, подобных старым 16-битным машинам Intel 8088, где был двухэтапный процесс определения адреса памяти, включающий 16-битный указатель сегмента (который идентифицировал 64-килобайтный блок памяти в 1-мегабайтном адресе). пробел), а затем второй 16-битный адрес памяти для определения конкретного адреса памяти в этом сегменте. Затем эти два 16-битных адреса были объединены, чтобы получить полный 20-битный адрес памяти. Таким образом, я полагаю, что в этом сценарии можно было бы различать отдельные 16-битные адреса и объединенные 20-битные адреса.

1
ответ дан 26 November 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: