私たちの学校のプロジェクトでは、c プログラムを 64 ビット アプリケーションにコンパイルすることしか許可されておらず、プログラムの速度とメモリ使用量をテストしています。ただし、32 ビット ポインターを使用できる場合、プログラムは 64 ビットよりもはるかに少ないメモリを消費します。
64 ビット アプリケーションで 32 ビット ポインタを使用できるかどうか疑問に思っています。
助けてくれてありがとう
私たちの学校のプロジェクトでは、c プログラムを 64 ビット アプリケーションにコンパイルすることしか許可されておらず、プログラムの速度とメモリ使用量をテストしています。ただし、32 ビット ポインターを使用できる場合、プログラムは 64 ビットよりもはるかに少ないメモリを消費します。
64 ビット アプリケーションで 32 ビット ポインタを使用できるかどうか疑問に思っています。
助けてくれてありがとう
GCC を使用していますか?
-mx32 オプションは、int、long、およびポインター型を 32 ビットに設定し、x86-64 アーキテクチャー用のコードを生成します。(Intel 386 および AMD x86-64 オプション):
次に、ベンチマーク:)
あなたは「あなた自身を転がす」ことができます。以下は、メモリ使用量をわずかに削減する可能性がありますが、短いポインターを絶対ポインターに変換する必要があるため、速度は向上しない可能性があり、オーバーヘッドが追加され、型チェックの利点のほとんどが失われます。
次のようになります。
typedef unsigned short ptr;
...
// pre-allocate all memory you'd ever need
char* offset = malloc(256); // make sure this size is less than max unsigned int
// these "pointers" are 16-bit short integer, assuming sizeof(int) == 4
ptr var1 = 0, var2 = 4, var3 = 8;
// how to read and write to those "pointer", you can hide these with macros
*((int*) &offset[var1]) = ((int) 1) << 16;
printf("%i", *((int*) &offset[var1]));
もう少しトリックを使えば、独自の brk() を発明して、オフセットからメモリを割り当てることができます。
その価値はありますか?IMO番号。