6

次のプログラムで、なぜとはsizeof(int)異なる値が返されるのか疑問に思いますsizeof(int*)

これが小さなプログラムです:

int main(){
    std::cout<<sizeof(int)<<endl;
    std::cout<<sizeof(int*)<<endl;
    return 0;
}

そしてここに出力があります:

4
8

今まで、整数ポインタのサイズは4byte(gccコンパイラ)であることを覚えています。ポインタの正しいサイズを確認するにはどうすればよいですか?それはコンピューターに依存していますか?

私はubuntu12.04を実行しています

# lsb_release -a

Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:    12.04 
Codename:   precise

ポインタのサイズは一定ではありませんか(標準サイズ)8バイト。

4

4 に答える 4

18

intとのサイズは、int*コンパイラとハードウェアに完全に依存します。で8バイトが使用されている場合はint*、64ビットのハードウェアを使用している可能性があります。これは、ポインターごとに8バイトに変換されます。

お役に立てれば!

于 2012-06-11T17:20:57.280 に答える
8

sizeof(char) == 1

他の保証はありません(*)。

実際には、ポインタは16ビットシステムではサイズ2、32ビットシステムでは4、64ビットシステムでは8になります。


(*)JamesKanzeのコメントを参照してください。

于 2012-06-11T17:22:32.940 に答える
4

ポインタのサイズは、システム、コンパイラ、およびアーキテクチャに依存します。32ビットシステムでは通常32ビットですが、64ビットシステムでは通常64ビットです。

後でポインタに復元するためにポインタを整数に格納しようとしている場合intptr_tは、通常の(機能しない)ポインタ型を保持するのに十分な大きさの整数型である型を使用できます。

于 2012-06-11T17:21:25.780 に答える
2

32ビットシステムの場合、「デファクト」スタンダードはILP32です。つまり、int、long、およびpointerはすべて32ビットの数量です。

64ビットシステムの場合、主要なUnixのデファクトスタンダードはLP64-longであり、ポインタは64ビットです(ただし、intは32ビットです)。Windows 64ビット標準はLLP64です。longlongとポインターは64ビットです(ただし、longとintは両方とも32ビットです)。

かつて、一部のUnixシステムはILP64組織を使用していました。

これらの事実上の標準はいずれもC標準(ISO / IEC 9899:1999)によって法制化されていませんが、すべて許可されています。

移植性に関心がある場合、またはタイプの名前にサイズを反映させたい場合は、次のマクロを使用できるヘッダーを確認できます。

int8_t int16_t int32_t int64_t

int8_t8ビットであることint16_tが保証されており、16ビットであることが保証されています。

この質問を参照してください。

于 2012-06-11T17:24:25.827 に答える