c - returning - robar bits de un puntero
pointer to int (2)
En The Art of Multiprocessor Programming, p215, los autores dicen que en C, se puede "robar" un poco de un puntero, y al usar operadores de bits se extrae un indicador (una marca) y el puntero de una sola palabra. No sé cómo se hace esto, así que un ejemplo me ayudaría.
Asegúrese de que los objetos de punta estén alineados en la memoria para que todos los punteros sean números pares. El último bit es entonces libre para almacenar un solo indicador booleano. (Esto no se puede hacer de forma completamente portátil, por lo que necesita conocimiento de la plataforma).
Mueva los punteros alrededor como enteros del tipo
uintptr_t
. Estos pueden ser manipulados fácilmente: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; }
Imagine un sistema con un tamaño de puntero de 32 bits, pero solo hay 1 GB de memoria disponible. Solo necesita 30 bits para abordar todo el espacio de la memoria, por lo que los 2 bits superiores no se utilizan. Puede usar estos dos bits superiores para sus propios fines, por ejemplo, para marcar punteros por tipo de puntero (pila / global vs. dinámica).
Tenga en cuenta que el código que obtiene como resultado es tan poco portátil como sea posible. Debe estar íntimamente familiarizado con la CPU en la que se ejecuta el código: específicamente, debe saber si los bits superiores se eliminan cuando se envía una dirección desde el puntero al bus de direcciones.