Provides 32bit -> 16bit pointer compression. More...
Provides 32bit -> 16bit pointer compression.
On many platforms, some pointers may have to be aligned, e.g., to 4 byte boundaries. On 32bit platforms, that makes it possible to store all possible aligned 32bit pointers in a 16bit value as long as the total memory is small (e.g., with 4 byte alignment, all pointers within 256kb RAM can be represented by a 16bit value). This can save memory, at the cost of some instructions for compression/decompression.
In order to use pointer compression, ZPTR_BASE needs to be defined to a (4 byte aligned) base address.
A printf format macro (PRIzptr) is provided.
You can then use zptr_t instead of a pointer type, using the supplied functions to compress / decompress, e.g.,
void func(void *ptr) {
    printf("%"PRIzptr"\n", ptr);
    ...
    free(ptr);
}
... would become
void func(zptr_t zptr);
    printf("%"PRIzptr"\n", zptr);
    ...
    free(zptrd(zptr));
}
If ZPTR_BASE is unset, zptr_t / zptrc() / zptrd() will transparently and without overhead compile to normal (uncompressed) pointer operations.
Files | |
| file | zptr.h | 
| 32bit -> 16bit pointer compression implementation  | |
Macros | |
| #define | PRIzptr PRIu16 | 
| zptr printf format definition  | |
| #define | ZPTR_MAX_ADDR ((uintptr_t)ZPTR_BASE + (1 << 18)) | 
| zptr highest compressible address  | |
Typedefs | |
| typedef uint16_t | zptr_t | 
| zptr type definition  | |
Functions | |
| static int | zptr_check (void *pointer) | 
| Determine if a pointer is compressible by zptrc()  More... | |
| static zptr_t | zptrc (void *pointer) | 
| Compress a pointer (if possible)  More... | |
| static void * | zptrd (zptr_t zptr) | 
| Decompress a pointer.  More... | |
      
  | 
  inlinestatic | 
      
  | 
  inlinestatic |