Всегда ли размер size_t
равен размеру void *
?
А может на некоторых платформах / компиляторах есть исключения?
Всегда ли размер size_t
равен размеру void *
?
А может на некоторых платформах / компиляторах есть исключения?
Хотя вполне вероятно, нет никаких гарантий. Если вам нужен целочисленный тип без знака, который гарантированно может представлять void *
, см. uintptr_t
.
uintptr_t
не гарантированно будет того же размера, что и указатель. Хотя я полагаю, что он, скорее всего, будет того же размера, чем size_t
.
- person Steve Jessop; 31.10.2013
uintptr_t
(а также intptr_t
) гарантированно содержат только значение указателя на void
(void *
) (см. 7.18.1.4 стандарта C).
- person alk; 31.10.2013
uintptr_t
существует, он может достоверно представлять любое значение void *
(т. Е. Преобразование из void *
в uintptr_t
и обратно является отображением идентичности), но нет ограничений против увеличения uintptr_t
(т. Е. Возможно, что есть значения uintptr_t
, не представимые в void *
, или этот uintptr_t
имеет дополнительные биты заполнения, из-за чего размер хранилища превышает void *
).
- person R.. GitHub STOP HELPING ICE; 31.10.2013
void *
и обратно (даже неявно, в C), так в чем разница?
- person ; 31.10.2013
uintptr_t
также не гарантируется, что он будет по крайней мере таким же большим. Он может быть меньше, если, например, в void*
есть биты, которые реализация не использует. Только допустимые значения указателя должны быть преобразованы без потерь в uintptr_t
и обратно, реализация не требуется, чтобы вы могли поместить любой старый битовый шаблон нужного размера в void*
и рассматривать его как указатель. Очевидно, это должна быть забавная архитектура, чтобы это было разумным решением, поскольку, если существует целочисленный тип того же размера, что и указатель, вы почти наверняка его используете.
- person Steve Jessop; 31.10.2013
void *
- вот разница. T i; uintptr_t uptr = &i;
не обязательно то же самое, что T i; uintptr_t uptr = (void *) &i;
- person alk; 31.10.2013