size_t по сравнению с uintptr_t

Просто HTMLEncode ссылки, когда Вы производите их. Удостоверьтесь, что Вы не позволяете javascript: ссылки. (Лучше иметь белый список протоколов, которые приняты, например, http, https, и mailto.)

244
задан Eric 22 March 2017 в 12:11
поделиться

6 ответов

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

Не обязательно! Вспомните, например, времена сегментированных 16-битных архитектур: массив может быть ограничен одним сегментом (так что подойдет 16-битный size_t ), НО вы можете иметь несколько сегментов (так что 32- Тип bit intptr_t потребуется для выбора сегмента, а также смещения внутри него). Я знаю, что эти вещи звучат странно в наши дни с единообразно адресуемой несегментированной архитектурой, но стандарт ДОЛЖЕН охватывать более широкий спектр, чем «что нормально в 2009 году», вы знаете! -)

231
ответ дан 23 November 2019 в 03:09
поделиться

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

Разве не простая разница в именах достаточная причина, чтобы использовать правильный тип для нужной вещи?

Если вы сохраняете размер, используйте size_t . Если вы храните указатель, используйте intptr_t . Человек, читающий ваш код, сразу узнает, что «ага, это размер чего-то, вероятно, в байтах» и «о, здесь значение указателя по какой-то причине сохраняется в виде целого числа».

В противном случае вы могли бы просто используйте unsigned long (или, в наши дни, unsigned long long ) для всего. Размер - это еще не все,

35
ответ дан 23 November 2019 в 03:09
поделиться

Относительно вашего утверждения:

«Стандарт C гарантирует, что size_t является типом, который может содержать любой индекс массива. Это означает, что логически size_t должен иметь возможность хранить любой тип указателя ».

На самом деле это заблуждение (заблуждение, возникающее из-за неправильного рассуждения) (a) . Вы можете подумать , что последнее следует из первого, но на самом деле это не так.

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

C99 утверждает, что верхний предел переменной size_t определяется как SIZE_MAX , и это может быть всего лишь 65535 (см. C99 TR3, 7.18.3, без изменений в C11) . Указатели были бы довольно ограничены, если бы они были ограничены этим диапазоном в современных системах.

На практике вы, вероятно, обнаружите, что ваше предположение верно, но это не потому, что это гарантирует стандарт. Потому что на самом деле не это гарантирует.


(a) Это не какая-то форма личной атаки, кстати, просто указание, почему ваши утверждения ошибочны в контекст критического мышления. Например, неверно и следующее рассуждение:

Все щенки милые. Эта штука милая. Следовательно, это должен быть щенок.

Симпатичность щенков здесь не имеет значения,

88
ответ дан 23 November 2019 в 03:09
поделиться

Возможно, размер самого большого массива меньше размера указателя. Подумайте о сегментированных архитектурах - указатели могут быть 32-битными, но один сегмент может адресовать только 64 КБ (например, старая архитектура 8086 реального режима).

Хотя они обычно не используются на настольных компьютерах. , стандарт C предназначен для поддержки даже небольших специализированных архитектур. Например, все еще разрабатываются встроенные системы с 8- или 16-разрядными процессорами.

12
ответ дан 23 November 2019 в 03:09
поделиться

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

Итак, конечно, как все уладилось, нам пока нужно не так много типов.

Но даже в LP64, довольно распространенной парадигме, нам нужны size_t и ssize_t для интерфейса системного вызова. Можно представить более ограниченную устаревшую или будущую систему, в которой использование полного 64-битного типа стоит дорого, и они могут захотеть использовать операции ввода-вывода размером более 4 ГБ, но все же иметь 64-битные указатели.

Я думаю, что у вас есть интересно: что могло быть разработано, что может произойти в будущем. (Возможно, 128-битные указатели для всей сети в распределенной системе, но не более 64 бит в системном вызове, или, возможно, даже «устаревшее» 32-битное ограничение. :-) Представьте, что старые системы могут получить новые компиляторы C ...

Также посмотрите, что существовало тогда. Как насчет мэйнфреймов CDC с 60-битным словом и 18-битным указателем, помимо множества моделей памяти реального режима 286? Как насчет серии Cray? Не говоря уже о нормальных ILP64, LP64, LLP64. (Я всегда думал, что Microsoft претенциозно представила LLP64, это должен был быть P64.) Я, конечно, могу представить комитет, пытающийся охватить все основы ...

3
ответ дан 23 November 2019 в 03:09
поделиться

Я полагаю (и это относится ко всем именам типов), что он лучше передает ваши намерения в коде.

Например, даже если unsigned short и ] wchar_t имеют тот же размер в Windows (я думаю), использование wchar_t вместо unsigned short показывает намерение, что вы будете использовать его для хранения широкого символа, а не просто произвольное число.

5
ответ дан 23 November 2019 в 03:09
поделиться
Другие вопросы по тегам:

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