2013-09-15 3 views
16

Гарантирует ли стандарт C99/C++ 11, что sizeof(size_t) == sizeof(void*) всегда верно?Is sizeof (size_t) == sizeof (void *) всегда верно?

size_t f(void* p) 
{ 
    return (size_t)(p); // Is it safe? 
} 

void* f(size_t n) 
{ 
    return (void*)(n); // Is it safe? 
} 
+8

Я не понимаю, почему его проголосовали за закрытие. Это законный вопрос. – Nawaz

+5

@ Наваз +1. Я думаю, что с тех пор, как «продемонстрировать минимальные знания» стало закрывающей причиной, некоторые люди считают, что нужно применять его слишком широко. – Angew

+1

'size_t' и' void * '- два нерелевантных типа. Почему они должны быть равны вообще? Я понимаю, что 'size_t' пытается хранить наибольшее число и' void * ', поскольку указатель пытается получить доступ к самому большому адресному пространству. Но он не говорит, что они должны быть равными. – deepmax

ответ

12

Нет, это не гарантировано. Используйте intptr_t или uintptr_t, чтобы безопасно хранить указатель в целочисленном размере.

Существуют/были архитектуры, где имеет смысл, чтобы это было ложным, например, сегментированная модель памяти DOS. Там память была структурирована в сегментах 64 тыс. - объект никогда не мог быть больше сегмента, поэтому было бы достаточно 16-бит size_t. Однако указатель имел части «сегмент» и «смещение», поэтому по определению они должны быть больше 16 бит, чтобы иметь возможность ссылаться на разные сегменты.

+2

К сожалению, 'intptr_t' и' uintptr_t' являются необязательными типами и могут существовать архитектуры, для которых не существует целочисленного типа, который достаточно велик, чтобы содержать указатель 'void'. –

+1

@BryanOlivier Действительно. Однако, если платформа поддерживает достаточно большое целое число, я бы определенно ожидал std. библиотеку, чтобы показать ее этими typedefs. И если платформа не делает этого, 'size_t' тоже не поможет. Поэтому я бы сказал, что присутствие этих типов можно использовать в качестве индикатора того, возможно ли такое приведение. – Angew

+0

Разве размер size_t не должен превышать размер указателя на большинстве современных операционных систем? –

Смежные вопросы