sizeof(何らかのポインタ)は常に4に等しいですか?

あなたが得る保証は 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 ビットのセグメント値で構成されているためです。