C99/C++11 標準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?
}
C99/C++11 標準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?
}
いいえ、それは保証されません。intptr_t
orを使用uintptr_t
して、ポインターを整数に安全に格納します。
セグメント化されたDOSメモリモデルなど、それが誤りであることが理にかなっているアーキテクチャがありました/ありました。そこでは、メモリは 64k セグメントで構成されていました。オブジェクトはセグメントよりも大きくなることはあり得ないため、16 ビットsize_t
で十分です。ただし、ポインターには「セグメント」部分と「オフセット」部分があるため、異なるセグメントを参照できるようにするには、定義により 16 ビットよりも大きくする必要があります。