1

シンプルで適度に効率的なbignumライブラリをCに実装しようとしています。コンパイルされたシステムのフルレジスタサイズ(おそらく32ビットまたは64ビットint)を使用して数字を格納したいと思います。私の理解では、intptr_tを使用してこれを達成できます。これは正しいです?より意味的に適切なタイプ、つまりintword_tのようなものはありますか?

また、GCCを使用すると、両方の引数を64ビットintにアップキャストすることで、32ビットマシンでオーバーフロー検出を簡単に実行できます。64ビットintは、2つのレジスタを占有し、IA31 ADC(キャリー付きで追加)などの命令を利用します。64ビットマシンで同様のことを行うことはできますか?これらの命令が利用可能な場合にコンパイルしてこれらの命令を使用するようにアップキャストできる128ビットタイプはありますか?さらに良いことに、レジスタサイズの2倍を表す標準タイプ(intdoubleptr_tなど)があるので、これはマシンに依存しない方法で実行できますか?

ありがとう!

4

2 に答える 2

1

C99<stdint.h>ヘッダーを使用することを強くお勧めします。int32_tint64_tuint32_t、および を宣言しuint64_tます。これらは、実際に使用したいもののように見えます。

EDIT:Alokが指摘しているように、、、int_fast32_tなどint_fast64_tはおそらくあなたが使いたいものです。指定するビット数は、計算が機能するために必要な最小値でなければなりません。つまり、計算が「ロールオーバー」しないようにするためです。

最適化は、CPU がデータの再調整、読み取り時の先行ビットのパディング、および書き込み時の読み取り-変更-書き込みのサイクルを無駄にする必要がないという事実から生じます。真実は、多くのプロセッサ (最近の x86 など) は、これらのアクセスを非常によく最適化するハードウェアを CPU に搭載しています (少なくともパディングと読み取り-変更-書き込み部分)。プロセッサとキャッシュ。

したがって、残された唯一のことは、アクセスが整列さsizeof(int_fast32_t)れていることを確認することです。それを使用して、バッファーポインターがそれに整列していることを確認します。

真実は、これはそれほど大きな改善にはならないかもしれません (ハードウェアが実行時に転送を最適化するため)。また、パフォーマンスに本当に夢中になっている場合は、SSE や AltiVec、またはプロセッサに搭載されているベクトル化技術を検討する必要があるかもしれません。これは、ベクトル化された数学を実行するときに移植可能な記述可能なものよりも優れているためです。

于 2010-01-10T05:21:42.520 に答える
1

size_t を使用しない理由はありますか? size_t は 32 ビット システムでは 4 バイト、64 ビット システムでは 8 バイトであり、おそらく WORD_SIZE を使用するよりも移植性が高くなります (WORD_SIZE は gcc 固有だと思いますよね?)

64 ビット システムでの 128 ビット値は認識していません。ここでは間違っている可能性がありますが、カーネルまたは通常のユーザー アプリでそのタイプに遭遇したことはありません。

于 2010-01-10T06:42:57.707 に答える