あなたが得る保証は sizeof(char) == 1
です . sizeof(int *) == sizeof(double *)
であることを保証しないなど、その他の保証はありません。 .
実際には、ポインターのサイズは 16 ビット システム (見つかった場合) では 2、32 ビット システムでは 4、64 ビット システムでは 8 になりますが、特定の値に依存しても何も得られません。サイズ。
単純な x86 32 ビット プラットフォームでも、さまざまなサイズのポインターを取得できます。例として次を試してください。
struct A {};
struct B : virtual public A {};
struct C {};
struct D : public A, public C {};
int main()
{
cout << "A:" << sizeof(void (A::*)()) << endl;
cout << "B:" << sizeof(void (B::*)()) << endl;
cout << "D:" << sizeof(void (D::*)()) << endl;
}
Visual C++ 2008 では、メンバー関数へのポインターのサイズとして 4、12、および 8 を取得します。
Raymond Chen はここでこれについて話しました。
すでに投稿されたリストのもう 1 つの例外です。 32 ビット プラットフォームでは、ポインタは 4 ではなく 6 を取ることができます 、バイト:
#include <stdio.h>
#include <stdlib.h>
int main() {
char far* ptr; // note that this is a far pointer
printf( "%d\n", sizeof( ptr));
return EXIT_SUCCESS;
}
このプログラムを Open Watcom でコンパイルして実行すると、6 になります。これがサポートする far ポインターは 32 ビットのオフセットと 16 ビットのセグメント値で構成されているためです。