long のサイズは、特定の CPU アーキテクチャの WORD サイズと常に等しいことがわかりました。すべてのアーキテクチャに当てはまりますか? CでWORDサイズの変数を表すポータブルな方法を探しています.
6 に答える
Cは命令を扱いません。struct
C99では、単一の割り当てを使用して任意のサイズをコピーできます。
struct huge { int data[1 << 20]; };
struct huge a, b;
a = b;
スマートコンパイラを使用すると、これにより、コピーを実行するための最速の(シングルスレッド、将来的にはマルチスレッドの)コードが生成されます。
int_fast8_t
ベンダーによって定義された「可能な限り最速の」整数型が必要な場合は、この型を使用できます。これはおそらくワードサイズに対応しますが、単一の命令で書き込み可能であるとは限りません。
int
最善のオプションは、デフォルトで1つのタイプ(たとえば)に設定し、Cプリプロセッサを使用して特定のCPU用に最適化することだと思います。
いいえ。実際には、スカラー単位とベクトル単位のワード サイズが異なることがよくあります。さらに、文字列命令と、変わった機能を備えた組み込みの DMA コントローラーがあります。
データを高速にコピーする場合memcpy
は、通常、プラットフォームの標準 C ライブラリからコピーするのが最も高速です。
Windowsでは、sizeof(long)
64ビットバージョンのWindowsでも4です。
いいえ、標準にはそのようなタイプはありません(メモリスループットを最大化)。
ただし、int
ALU演算を実行するには、プロセッサにとって最速のタイプである必要があると記載されています。
組み込みの世界では物事はより複雑になります。ASAIK、C51は8ビットプロセッサですが、c51のKeil Cでは、longは4バイトです。コンパイラに依存していると思います。
あなたが得る最も近い答えは...
int
多くのunsigned int
場合 (常にではありません)、マシンのレジスター幅と一致します。- ポインターと同じサイズの整数であるタイプがあり、綴り
intptr_t
があり、stddef.h IIRC から入手できます。保証があるかどうかはわかりませんが、これは明らかにアーキテクチャのアドレス幅と一致するはずです。
ただし、多くの場合、アーキテクチャには単一のワードサイズがありません。幅の異なるレジスタが存在する可能性があり (例: Intel x86 の「通常の」レジスタと MMX レジスタ)、レジスタ幅はバス幅と一致しないことがよくあります。 、アドレスとデータは幅が異なる場合があります。