比较uintptr_t和指针类型的最佳方法是什么?

问题描述 投票:3回答:2

它只是reinterpret_cast吗?

int *pointer;
uintptr_t value;
value == reinterpret_cast<uintptr_t>(pointer);
c++ comparison
2个回答
4
投票

真的取决于你的目标。

[expr.reinterpret.cast]

4指针可以显式转换为足以容纳它的任何整数类型。映射函数是实现定义的。 [注意:对于那些了解底层机器的寻址结构的人来说,这并不奇怪。 - 尾注] std​::​nullptr_­t类型的值可以转换为整数类型;转换与(void*)0转换为整数类型具有相同的含义和有效性。

5可以将整数类型或枚举类型的值显式转换为指针。转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射在其他方面是实现定义的。

映射是实现定义的(显然)。如果你想检查pointer的值是否用于初始化value,那么你的检查是不够的。以上并不保证reinterpret_cast<uintptr_t>(pointer)将始终产生相同的整数,即使今天所有理智的实现都这样做。

我会反过来检查,因为我们有往返保证:

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

但即便如此,这也是一个相当薄弱的保证。如果我是你,我不会过多地谈论这些转换。重新考虑您的设计可能是值得的。


1
投票

如果你遵循标准的字母,你应该使用

value == (uintptr_t)(void*)pointer

或使用reinterpret_cast

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

我个人觉得不太可读。编译器自然会删除所有“绒毛”。

© www.soinside.com 2019 - 2024. All rights reserved.