1

long のサイズは、特定の CPU アーキテクチャの WORD サイズと常に等しいことがわかりました。すべてのアーキテクチャに当てはまりますか? CでWORDサイズの変数を表すポータブルな方法を探しています.

4

6 に答える 6

3

Cは命令を扱いません。structC99では、単一の割り当てを使用して任意のサイズをコピーできます。

struct huge { int data[1 << 20]; };
struct huge a, b;
a = b;

スマートコンパイラを使用すると、これにより、コピーを実行するための最速の(シングルスレッド、将来的にはマルチスレッドの)コードが生成されます。

int_fast8_tベンダーによって定義された「可能な限り最速の」整数型が必要な場合は、この型を使用できます。これはおそらくワードサイズに対応しますが、単一の命令で書き込み可能であるとは限りません。

int最善のオプションは、デフォルトで1つのタイプ(たとえば)に設定し、Cプリプロセッサを使用して特定のCPU用に最適化することだと思います。

于 2010-03-22T00:26:09.683 に答える
3

いいえ。実際には、スカラー単位とベクトル単位のワード サイズが異なることがよくあります。さらに、文字列命令と、変わった機能を備えた組み込みの DMA コントローラーがあります。

データを高速にコピーする場合memcpyは、通常、プラットフォームの標準 C ライブラリからコピーするのが最も高速です。

于 2010-03-22T00:54:24.563 に答える
2

Windowsでは、sizeof(long)64ビットバージョンのWindowsでも4です。

于 2010-03-22T00:33:15.363 に答える
1

いいえ、標準にはそのようなタイプはありません(メモリスループットを最大化)。

ただし、intALU演算を実行するには、プロセッサにとって最速のタイプである必要があると記載されています。

于 2010-03-22T00:34:19.680 に答える
1

組み込みの世界では物事はより複雑になります。ASAIK、C51は8ビットプロセッサですが、c51のKeil Cでは、longは4バイトです。コンパイラに依存していると思います。

于 2010-03-22T01:35:35.720 に答える
1

あなたが得る最も近い答えは...

  • int多くのunsigned int場合 (常にではありません)、マシンのレジスター幅と一致します。
  • ポインターと同じサイズの整数であるタイプがあり、綴りintptr_tがあり、stddef.h IIRC から入手できます。保証があるかどうかはわかりませんが、これは明らかにアーキテクチャのアドレス幅と一致するはずです。

ただし、多くの場合、アーキテクチャには単一のワードサイズがありません。幅の異なるレジスタが存在する可能性があり (例: Intel x86 の「通常の」レジスタと MMX レジスタ)、レジスタ幅はバス幅と一致しないことがよくあります。 、アドレスとデータは幅が異なる場合があります。

于 2010-03-22T00:37:21.710 に答える