10

The Art of Multiprocessor Programming の p215 で、著者は、C ではポインターからビットを「盗む」ことができ、ビットごとの演算子を使用して単一の単語からフラグ (マーク) とポインターを抽出できると述べています。これがどのように行われるのかわからないので、例が役に立ちます。

4

2 に答える 2

12
  1. すべてのポインターが偶数になるように、pointee オブジェクトがメモリ内で整列されていることを確認してください。最後のビットは、1 つのブール値フラグを格納するために解放されます。(これは完全に移植可能ではありません。そのため、プラットフォームの知識が必要です。)

  2. ポインタを型の整数として移動しますuintptr_t。これらは簡単に操作できます。

    bool get_flag(uintptr_t p)
    {
        return p & 1;
    }
    
    void *get_pointer(uintptr_t p)
    {
        return (void *)(p & (UINTPTR_MAX ^ 1));
    }
    
    uintptr_t set_flag(uintptr_t p, bool value)
    {
        return (p & (UINTPTR_MAX ^ 1)) | value;
    }
    
于 2013-10-15T19:25:35.063 に答える
10

ポインタ サイズが 32 ビットで、メモリが 1GB しかないシステムを想像してみてください。メモリ空間全体をアドレス指定するには 30 ビットしか必要ないため、上位 2 ビットは使用されません。これらの上位 2 ビットは、独自の目的で使用できます。たとえば、ポインターの種類 (スタック/グローバルと動的) でポインターをマークする場合などです。

結果として得られるコードは、移植性がないことに注意してください。コードが実行される CPU に精通している必要があります。具体的には、ポインタからのアドレスがアドレス バスに送信されるときに上位ビットがドロップされるかどうかを知る必要があります。

于 2013-10-15T19:20:51.903 に答える