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

时间:2019-03-14 10:16:40

标签: c++ comparison

仅仅是reinterpret_cast吗?

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

2 个答案:

答案 0 :(得分:4)

取决于您的目标。

  

[expr.reinterpret.cast]

     

4指针可以显式转换为任何整数类型   大到足以容纳它。映射功能是   实现定义的。 [注意:这并不奇怪   那些了解底层机器的寻址结构的人。   — end note]类型std​::​nullptr_­t的值可以转换为   整体型转换与   将(void*)0转换为整数类型。

     

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

(显然)映射是实现定义的。如果您希望检查pointer的值是否用于初始化value,则检查不足。上面的内容并不保证reinterpret_cast<uintptr_t>(pointer)总是会产生相同的整数,即使当今所有明智的实现都可以做到这一点。

我将进行反向检查,因为我们有往返保证:

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

但是即便如此,这还是一个很薄弱的保证。如果我是你,我不会为这些转换而烦恼。可能值得重新考虑您的设计。

答案 1 :(得分:1)

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

x_coord = [23, 53, 2, -12, 95, 103, 14, -5]
y_coord = [677, 233, 405, 433, 905, 376, 432, 445]
z_coord = [4, 16, -6, -42, 3, -6, 23, -1]
labels = ["F", "J", "A", "Q", "Y", "B", "W", "X"]

points = []
for point in zip(labels, x_coord, y_coord, z_coord):
    points.append("{}: {}, {}, {}".format(*point))

for point in points:
    print(point)

或使用value == (uintptr_t)(void*)pointer

reinterpret_cast

我个人认为它的可读性较差。自然,编译器会删除所有“绒毛”。