В чем разница между uinptr_t, size_t, ptrdiff_t

В чем разница между ********, size_t, ptrdiff_t. Когда и какой из типов использовать и могут ли они отличаться друг от друга размером?
7 ответов

Вот, почитайте: http://www.viva64.com/ru/a/0050/


Уже почитал, спасибо .Теперь меня интересует исторический аспект. Что и из какого стандарта вылезло...


Вот, почитайте: http://www.viva64.com/ru/a/0050/
"Другими словами в переменную типа size_t может быть безопасно помещен указатель" - по ссылке написана расхожая ерунда.Тип ********* - это и есть тип, специально предназначенный для "хранения" указателей. Именно в этот тип (а не в size_t) можно безопасно записать указатель. Для того этот тип и был введен.Тип size_t - беззнаковый тип, способный хранить байтовый размер наибольшего непрерывного объекта в С и С++. Однако из это никак не следует, что "в переменную типа size_t может быть безопасно помещен указатель." Никто вам никогда не обещал, то реализация разрешит вам создавать объекты размером "на всю память" ("на все адресное пространство"). Реализация имеет право ограничить максимальный размер объекта по своему усмотрению и, соответственно, уменьшить размер типа size_t. По этой причине в тип size_t нельзя записать указатель. Размер типа size_t в общем случае - меньше или равен размеру указателя. Классический пример реализаций с "маленьким" size_t - платформы с сегментной организацией памяти. Утверждения, что в тип size_t всегда можно записать указатель (как по ссылке), как правило делаются пионерами, которые не видели никаких других моделей памяти, кроме плоской. Не пытайтесь использовать тип size_t для хранения указателей. Для этого существует *********.Тип ptrdiff_t - знаковый тип, который предназначен для хранения разности двух указателей, указывающих на элементы одного и того же массива. Из этого следует, что в общем случае тип ptrdiff_t должен быть на 1 бит шире, чем тип size_t. Однако спецификации С и С++ не требуют этого и разрешают типу ptrdiff_t иметь ту же самую ширину, что size_t. Это означает, что если вы сумеете создать массив, размером больше чем SIZE_MAX / 2, то разность между указателями на элементы такого массива запросто может не поместиться в ptrdiff_t. Некоторые реализации, в которых ptrdiff_t и size_t имеют одинаковую ширину, просто запрещают создавать объекты, размером больше SIZE_MAX / 2 байт. А некоторые - не запрещают и перекладывают всю ответственность на плечи пользователя.


Спасибо. А intptr_t для чего тогда нужен? Зачем нужен знаковый тип, в который можно поместить указатель?


"Другими словами в переменную типа size_t может быть безопасно помещен указатель" - по ссылке написана расхожая ерунда.
Там в самом начале висит предупреждение:
Сразу заметим, что данные в статье определения и рекомендации относятся к наиболее распространненым на данный момент архитектурам (IA-32, Intel 64, IA-64), и могут быть неточны по отношению к экзотическим архитектурам.


Замечание о сдвиговых операциях весьма интересно.