Каков наилучший способ сравнить uintptr_t и тип указателя? - PullRequest
3 голосов
/ 14 марта 2019

Это просто reinterpret_cast?

int *pointer;
uintptr_t value;
value == reinterpret_cast<uintptr_t>(pointer);

Ответы [ 2 ]

4 голосов
/ 14 марта 2019

Действительно зависит от вашей цели.

[expr.reinterpret.cast]

4 Указатель может быть явно преобразованк любому целочисленному типу, достаточно большому для его удержания.Функция отображения определяется реализацией.[Примечание: предполагается, что это не удивительно для тех, кто знает структуру адресации базовой машины.- примечание конца] Значение типа std​::​nullptr_­t может быть преобразовано в целочисленный тип;преобразование имеет то же значение и допустимость, что и преобразование (void*)0 в целочисленный тип.

5 Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель.Указатель, преобразованный в целое число достаточного размера (если таковое существует в реализации) и обратно в тот же тип указателя, будет иметь свое первоначальное значение;в противном случае отображения между указателями и целыми числами определяются реализацией.

Отображение определяется реализацией (очевидно).Если вы хотите проверить, что значение pointer было использовано для инициализации value, то вашей проверки недостаточно.Вышеприведенное не обещает, что reinterpret_cast<uintptr_t>(pointer) всегда будет давать одно и то же целое число, даже если все сегодняшние здравомыслящие реализации это делают.

Я бы сделал проверку в обратном порядке, поскольку у нас есть гарантия приема-передачи:

reinterpret_cast<int*>(value) == pointer;

Но даже тогда это довольно слабая гарантия.Я бы не стал слишком много болтать с этими обращениями на вашем месте.Возможно, стоит пересмотреть ваш дизайн.

1 голос
/ 14 марта 2019

Если вы следуете стандарту к письму, вы должны использовать

value == (uintptr_t)(void*)pointer

или reinterpret_cast:

value == reinterpret_cast<uintptr_t>(reinterpret_cast<void*>(pointer))

, которые лично я нахожу менее читабельными.Естественно, компилятор удалит все «пух».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...