基本的な「int」型の良いところは、現在コンパイルしているプラットフォームに関係なく、ほぼ常に最速の整数型になることです。
一方、たとえば int32_t (単なる int の代わりに) を使用する利点は、コンパイルされたプラットフォームに関係なく、int32_t が常に 32 ビット幅であることをコードが期待できることです。つまり、より多くの仮定を安全に行うことができます。 int を使用した場合よりも値の動作について。固定サイズの型では、コードが新しいプラットフォーム Y でコンパイルされた場合、古いプラットフォーム X で行ったのとまったく同じように動作する可能性が高くなります。
int32_t の (理論上の) 欠点は、新しいプラットフォーム X が 32 ビット整数をサポートしない可能性があることです (その場合、コードはそのプラットフォームでまったくコンパイルされません)。古い整数。
ほとんどすべての最新のハードウェアは 32 ビット整数を全速力で処理するため、上記の例は少し不自然ですが、int64_ts の操作が int の操作よりも遅いプラットフォームが実際に (そして実際に) 存在します。したがって、各操作を複数のステップに分割する必要があります。もちろん、(b) 64 ビット整数は 32 ビット整数の 2 倍のメモリを占有し、キャッシュに余分な圧力をかける可能性があります。
ただし、人々が作成したソフトウェアの 99% については、この問題がパフォーマンスに目に見える影響を与えることはないことに注意してください。つまり、integer-width が大きなパフォーマンスの問題になる可能性は低いです。要するに、整数演算をどのように動作させたいかということです。
整数値が常に 32 ビットの RAM を占有し、コンパイルしているプラットフォームに関係なく、常に 2^31 (または符号なしの場合は 2^32) で「ラップアラウンド」することをコンパイラーに保証させたい場合は、次のようにします。 int32_t (など) を使用します。
ラッピング動作をあまり気にせず (格納しているデータの性質上、整数が決してラップされないことがわかっているため)、奇数/異常なコンパイル ターゲットに対してコードをもう少し移植しやすくしたい場合、そして少なくとも理論的にはより高速です(おそらく実際にはそうではありませんが)。
個人的には、固定サイズの型 (int32_t など) をデフォルトで使用していますが、そうしない明確な理由がある場合を除きます。これは、プラットフォーム全体でのバリアント動作の量を最小限に抑えたいためです。たとえば、次のコード:
for (uint32_t i=0; i<4000000000; i++) foo();
... 常に foo() を正確に 4000000000 回呼び出しますが、このコードは次のとおりです。
for (unsigned int i=0; i<4000000000; i++) foo();
(sizeof(int)>=4) かどうかによって、foo() を 4000000000 回呼び出すか、無限ループに入る可能性があります。確かに、2 番目のスニペットが特定のプラットフォームでそれを行わないことを手動で検証することは可能ですが、いずれにせよ 2 つのスタイル間のパフォーマンスの差がほぼゼロであることを考えると、その動作を予測することはノーであるため、最初のアプローチを好みます。より簡単に。char/short/int/long アプローチは、コンピューター アーキテクチャがより多様であり、CPU が十分に遅く、安全なコーディングよりも完全なネイティブ パフォーマンスを達成することが重要だった C の初期の頃に、より有用であったと思います。