Всегда ли размер size_t равен размеру void *

Всегда ли размер size_t равен размеру void *?

А может на некоторых платформах / компиляторах есть исключения?


person Community    schedule 31.10.2013    source источник
comment
AFAIK, как правило, это typedef беззнакового int, который полностью зависит от компилятора.   -  person texasbruce    schedule 31.10.2013


Ответы (1)


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

person gsg    schedule 31.10.2013
comment
uintptr_t не гарантированно будет того же размера, что и указатель. Хотя я полагаю, что он, скорее всего, будет того же размера, чем size_t. - person Steve Jessop; 31.10.2013
comment
uintptr_t (а также intptr_t) гарантированно содержат только значение указателя на void (void *) (см. 7.18.1.4 стандарта C). - person alk; 31.10.2013
comment
@SteveJessop Вы правы, он гарантированно будет большим достаточно (и все, что требуется вуду для хранения любого указателя). - person ; 31.10.2013
comment
Гарантируется, что он может представлять указатель, поэтому он должен быть как минимум такого же размера: однако он может быть больше. Думаю, ты прав. - person gsg; 31.10.2013
comment
Если uintptr_t существует, он может достоверно представлять любое значение void * (т. Е. Преобразование из void * в uintptr_t и обратно является отображением идентичности), но нет ограничений против увеличения uintptr_t (т. Е. Возможно, что есть значения uintptr_t, не представимые в void *, или этот uintptr_t имеет дополнительные биты заполнения, из-за чего размер хранилища превышает void *). - person R.. GitHub STOP HELPING ICE; 31.10.2013
comment
@alk Любой указатель может быть преобразован в void * и обратно (даже неявно, в C), так в чем разница? - person ; 31.10.2013
comment
Теперь я думаю об этом, есть также вероятность, что указатели на функции не могут быть представлены (не было ли какой-то старой машины с разными представлениями для указателей на функции и данные?) - person gsg; 31.10.2013
comment
@delnan: указатели на функции не могут - person Chris Dodd; 31.10.2013
comment
uintptr_t также не гарантируется, что он будет по крайней мере таким же большим. Он может быть меньше, если, например, в void* есть биты, которые реализация не использует. Только допустимые значения указателя должны быть преобразованы без потерь в uintptr_t и обратно, реализация не требуется, чтобы вы могли поместить любой старый битовый шаблон нужного размера в void* и рассматривать его как указатель. Очевидно, это должна быть забавная архитектура, чтобы это было разумным решением, поскольку, если существует целочисленный тип того же размера, что и указатель, вы почти наверняка его используете. - person Steve Jessop; 31.10.2013
comment
@delnan: Необходимое преобразование в void * - вот разница. T i; uintptr_t uptr = &i; не обязательно то же самое, что T i; uintptr_t uptr = (void *) &i; - person alk; 31.10.2013
comment
@gsg Да. Программы DOS имели различные модели, в которых указатели функций были 2 или 4 байта, а указатели данных независимо были 2 или 4 байта. - person chux - Reinstate Monica; 01.11.2013