2

2 ビットまたは 3 ビットごとに設定ビットを 64 ビット整数に設定するデータ構造を構築しています。

代わりに、この構造体にポインターを格納することもできれば便利です (それらがツリー内のターミナル ノードである場合、それは関係ありません)。

私の表現 (最上位または 2 番目に上位のビットのいずれかが設定されることを保証する) の目的で、ポインターが最上位の 2 つのビットを決して設定しないと仮定できる場合、つまり、このアサーションが成り立ちます。

void *sixty_four_bit_pointer = a_valid_address(); 
bool always_zero = 0xC000000000000000 & sixty_four_bit_pointer;

それなら私はこのトリックをすることができます!

4

1 に答える 1

9

これは一般的に安全ではありません。/LARGEADDRESSAWAREWindows のフラグにつながったのは、このようなトリックを実行するプログラムです。(別名「これが私たちが素敵なものを持てない理由です。」)

できることは、上位ビットの代わりに下位ビットを使用することです。構造体にはポインターが含まれているため、既に 8 バイトにアラインされています。つまり、下位 3 ビットは常に 0 であるため、これらのビットをタグ ビットとして使用できます。

于 2012-12-10T04:50:09.203 に答える