20

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?
}
4

1 に答える 1

13

いいえ、それは保証されません。intptr_torを使用uintptr_tして、ポインターを整数に安全に格納します。

セグメント化されたDOSメモリモデルなど、それが誤りであることが理にかなっているアーキテクチャがありました/ありました。そこでは、メモリは 64k セグメントで構成されていました。オブジェクトはセグメントよりも大きくなることはあり得ないため、16 ビットsize_tで十分です。ただし、ポインターには「セグメント」部分と「オフセット」部分があるため、異なるセグメントを参照できるようにするには、定義により 16 ビットよりも大きくする必要があります。

于 2013-09-15T09:22:00.560 に答える