什么是uintptr_t,它可以用来做什么?
发布于 2017-12-27 13:02:57
它是一个能够存储指针的无符号int。这通常意味着它与指针的大小相同。
它是在C++11和更高版本的标准中定义的。
想要一个能够保存架构指针类型的整数类型的一个常见原因是对指针执行特定于整数的操作,或者通过提供一个整数“句柄”来模糊指针的类型。
发布于 2017-12-27 13:23:19
第一件事,在问题提出的时候,uintptr_t
不在C++中。在C99中<stdint.h>
,作为可选类型。许多C++03编译器确实提供了该文件。它也在C++11中,在<cstdint>
,这里它还是可选的,它引用C99作为定义。
在C99中,它被定义为“一个无符号整数类型,它的属性是,任何指向void的有效指针都可以转换为此类型,然后再转换回指针为void,结果将与原始指针相比较”。
把这个当成它说的意思。它没有提到任何关于尺寸的东西。
uintptr_t
可能与void*
它可能更大。尽管这样的C++实现方法是不正常的,但它可能会更小。例如,在某个假设的平台上void*
是32位,但是只使用了24位虚拟地址空间,您可以拥有24位。uintptr_t
满足了要求。我不知道为什么一个实现会这样做,但标准允许这样做。
发布于 2017-12-27 14:40:36
对于“uintptr是什么?”这部分已经有了很多很好的答案。uintptr_t数据类型“。我将尝试在这篇文章中提到“它可以用于什么?”部分。
主要用于指针的按位操作。请记住,在C++中,不能对指针执行按位操作。原因见为什么不能对C中的指针进行按位操作,还有什么方法可以避免这种情况呢?
因此,为了对指针执行按位操作,需要将指针转换为unitpr类型。[医]然后执行按位操作。
下面是我刚刚编写的一个函数的示例,它是按位排他性的,或者是两个指针存储在XOR链接列表中,这样我们就可以像双链接列表那样在两个方向上遍历,但不需要在每个节点中存储2个指针。
template <typename T>
T* xor_ptrs(T* t1, T* t2)
{
return reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(t1)^reinterpret_cast<uintptr_t>(t2));
}
https://stackoverflow.com/questions/-100001312
复制相似问题