Cでのポインタのサイズはどれくらいですか?


ベストアンサー

> cat pointersize.c

#include

int main(){

int *ip;

printf(“pointer size: \%zu\n”, sizeof(ip));

}

> cc -o pointersize pointersize.c

> ./pointersize

pointer size: 8

> cc -m32 -o pointersize pointersize.c

> ./pointersize

pointer size: 4

ポインターサイズは、コードをコンパイルするモデルにのみ依存します。オペレーティングシステムではありません。だから私は64ビットLinuxを持っていますが、gccに32ビットコードをコンパイルさせると、わずか4バイトのポインタサイズで32ビットELFとi386コードを取得します。

Windowsで4バイトを取得した場合、それはあなたを意味しますまだ32ビットをコンパイルしているので、マシンの可能性を最大限に引き出すためのスイッチを見つける必要があります。クラーケンを解き放ちましょう!

昨日、32ビットi386コードとx86\_64 bdver2(Piledriver、Haswell以降)のパフォーマンスの間で、速度ゲインの5倍以上になる可能性があることをベンチマークしました。より大きなメモリモデル。これはほとんど重要ではありません。ほとんどのアプリケーションでは4GBのメモリで十分です。

しかし、32ビットコードだけで、MMX、SSE、SSE2、3、4の機能が失われ始め、アセンブリの多くの進歩が過去35年間。データ転送、ビット操作、文字列操作、高度な数学関数、および、および、へのより高速なアクセスに加えて、…

場合によっては、元のx86コードが利点ですが、できません。コードの厳しさを打ち負かしてください!

編集:(そして小さな暴言、無視してもかまいません)

わかりました、私はいつもそのような文の価値をチェックしています。 x86\_64と8086のレガシーコードをコンパイルしたばかりです。 x88\_64の場合は53バイト、プログラムが少ない8086レガシーコードの場合は74バイト。ええと…8/16ビットに保つならこれは本当かもしれません。しかし、最新のソフトウェアやcプログラムやコンパイラではそうではありません。だから、古い遺産の時代がなくなったことについての涙はありません。正直に言って、彼らはたわごとでした。唯一の良い点は、当時私が若く輝いていたことでした。しかし、それには他にも欠点がありました。

要点は、最新のプロセッサは本当にクールだということです。私たちは今、80年代に私たちの夢の中でしか持っていなかったものを持っています。ついに、1バイトか2バイトを気にしないほど十分な大きさのハードドライブができました。 Windowsやその他のリソースを大量に消費しない限り、十分なメモリがあります。 CPUにはベクトル処理があり、GPUには完全な並列計算があります。マルチコア、数学FPU、MMX、SSE、SSExのような特殊なレジスタがあり、FMA3とFMA4があります(少なくともAMDプロセッサを使用している場合は、それを手に入れるために長い間待つ必要があります)。マイクロコードまたはハードウェアでさえすべてのクールなことを実行する非常に洗練されたアセンブリオペコードを取得しました。多くの場合、1サイクルで実行されるだけで、80年代に夢見ていたものよりも大きいキャッシュメモリを取得しました。 。

そして80年代の「来たるべき」ものはCDであり、安価なシルバープレートに驚異的なギガバイトを保存するというアイデアは想像を絶するものでした。そして、その中にコンピューターを搭載した電話があり、85年の最大のメインフレームコンピューターを速度の10000倍程度でシミュレートできます。

これで、すばらしいものがすべて揃いました!

しかし、私たちはそれで何をしているのですか? 144文字をツイッターします。私たちの真新しいプロセッサのアセンブリオペコードの驚異はもう誰も知りません。クソスパムをクリックするだけで、私が勉強を始めた1985年でも、「もうすぐなくなった」、「くだらない」、「そのがらくたをどうするか」と評価されたWindowsシステムを駆り立てます。

Windowsでは本当に良くなりませんでした。それはまだバグが多く、マルウェアでスパムされたがらくたであり、コンピュータハードウェアの驚異を覆い隠しているので、私たちの時代により適したOSをインストールすると、頭がおかしくなります。特に開発者として。

プロセッサの開発は減速しており、競合他社は2つしか市場に残っていません。今こそ、すでに持っているものを解き放つときです。32ビットのたわごとをオフにして、最適化を開始してください。可能な場合はアセンブリ内のライブラリコード。オプションで、常に純粋な「C」にフォールバックします。

そしてTwitterとは何ですか?それは冗談ですよね? 144文字?!それは深刻ではありませんか?彼らは私たちがどんな種類のハードウェアを持っているかに気づきましたか? Twitterに反対する言葉はありません、素晴らしいサービスですが、あなたは私が何を意味するか知っています。彼らはとても小さいと思っていて、それでも失敗します。

答え

あなたはこの答えを嫌うでしょう。

準備はいいですか?

ポインタは、Cプログラムがコンパイルされているマシン上のアドレスのサイズです。

  • 1980年代に普及したZ80マイクロプロセッサでは、ポインタは16ビットです。
  • 元の8086では、アドレス空間の幅が20ビットしかない場合でも、ポインタは16、20、または32ビットである可能性があります。 Cコンパイラに、ポインタの幅を指定するコマンドライン引数を指定する必要がありました。それは悪夢でした。長くて恐ろしい紹介については、ウィキペディアで「メモリモデル」を検索してください。
  • 68000マイクロプロセッサでは、ポインタは32ビットでした。
  • 約5年前までIntelプロセッサに使用されていたx86モデルでは、ポインタは32ビットであり、約4GBをアドレス指定できました。この制限により、64ビットアドレスが作成されます。
  • 過去数世代のIntelプロセッサで使用されているx64モデルでは、ポインタは64ビットです。

できません。ポインタがintと同じサイズ、またはlongと同じサイズであると想定します。整数定数0はポインタに変換できますが、他の整数定数は変換できない場合があります。 0をポインタに変換する場合、これは一般的ですが、ポインタに含まれるビットがすべてゼロになるという保証はありません。それは何でもかまいません。 0は、有効なアドレスがないことを指すポインタに変換されます。整数をポインターに追加してポインターを生成するか、ポインターから整数を減算してポインターを生成することができます。それ以外は未定義の効果があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です