Можно ли с уверенностью предположить, что 16 старших бит (мне достаточно 2) в 64-битном указателе не установлены?

Я строю структуру данных, которая устанавливает в 64-битные целые числа установленный бит каждые 2 или 3 бита.

Для меня было бы удобно, если бы я мог поочередно также хранить указатель в этой структуре (когда они являются конечными узлами в дереве, но это не имеет значения).

Для целей моего представления (которое гарантирует, что установлены либо самый старший, либо второй старший бит), если можно предположить, что у указателей никогда не установлены свои старшие два бита, то есть выполняется это утверждение:

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

тогда я могу сделать этот трюк!

2

Решение

Это не безопасно в целом. Это программы, которые трюки, как это, которые привели к /LARGEADDRESSAWARE флаг в винде. (Иначе: «Вот почему у нас не может быть хороших вещей».)

Что вы можете сделать, это использовать нижние биты вместо верхних битов. Поскольку ваша структура содержит указатель, он уже выровнен по 8 байтов, что означает, что три нижних бита всегда равны 0, поэтому вы можете использовать эти биты в качестве битов тега.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]