10

私はこのCプロジェクトの真っ最中で、メモリを非常に効率的にしたいと考えています。いくつかのケースでは、ビットを保持するために記述した動的配列構造の void * を使用しています。64 (この場合) ビットすべてを使用したいと考えています。

私はすぐに、実際にはポインターに対してビット操作を行うことができないことに気付きました。だから私の解決策は次のとおりでした:

void *p;
((unsigned long)p) << 4;
((unsigned long)p) & 3;

これで仕事は完了しますが、それは私のコンピューターでは long とポインターのサイズが等しいためです。これは、すべての (またはほとんどの) アーキテクチャに当てはまりますか?

そして私の本当の質問:ポインターでビット操作を行うためのより正しい方法はありますか? このアプローチは C ではやや一般的 (ビットを void * にパックする) だと思っていましたが、間違っている可能性があります...

4

4 に答える 4

17

コンパイラがサポートしている場合、C99 の<stdint.h>ヘッダーは、システム上でポインターを保持するのに十分な大きさの型intptr_tと型を提供しますが、整数であるため、ビット操作を行うことができます。uintptr_tそれがあなたが探しているものなら、それよりもはるかにポータブルになることはありません。

于 2009-12-04T06:20:54.660 に答える
8

ポインタに対してこの種の操作を行う必要がある場合は、ポインタをintptr_tおよびuintptr_tにキャストできます。どちらも にありますstdint.h。これらは、ポインターを保持するのに十分なビットを持つプラットフォーム固有の整数型として定義されることが保証されています。

ptrdiff_t2 つのポインターの違いを保持するために何かが必要な場合は、そこにもあります。

于 2009-12-04T06:23:20.380 に答える
3

あなたは間違った問題を解決しようとしていると思います。本当の問題はここにあります:

ビットを保持するために、作成した動的配列構造の void * を使用しています。

ビットを保持するために void ポインターを使用しないでください。void ポインターを使用してポインターを保持します。ビットを保持するために符号なし整数を使用します。

于 2009-12-04T06:49:58.750 に答える
2

ポインターとビットフィールドの共用体を宣言します。

于 2009-12-04T06:22:52.450 に答える