理解空*反对intptr_t和uintptr_t

Understanding void* against intptr_t and uintptr_t

本文关键字:uintptr intptr 反对      更新时间:2023-10-16

这是我正在测试的代码:

int value = 0;
void* addyvoid = static_cast<void*>(&value); // C++-style cast.

它工作得很好,但我可以使用uintptr_t/intptr_t.但是它们并不像人们在这里所说的那样适合持有指针,因为它们太大了。那么,这是真的吗?但是,如果是,使用void*来保存指针会更好,但是会丢失数据吗?

intptr_tuintptr_t的目的是,在某些应用程序中,您确实需要对指针值进行某种数值计算,也许通过翻转单个位,也许通过对它们进行 XOR 等。在这些情况下,当您需要使用指针的数值时,intptr_tuintptr_t是整数类型(如果存在),保证它们足够大以容纳任何指针。这不适用于int,因为int相对于指针大小的大小没有指定。

由于执行这些转换从根本上是不安全的,因此C++要求您使用reinterpret_cast来与intptr_tuintptr_t和指针类型进行转换。

如果您所做的只是存储"指向某物的指针",并且该指针不是函数指针或成员函数指针,则可以将其强制转换为void*。该强制转换保证工作,从void*转换回原始类型只需要static_cast,并保证安全。

intptr_tuintptr_t的大小并不是避免它们的好理由。它们只是用于不同的应用程序。如果需要对指针进行数值计算,请使用这些类型。否则,如果您只需要存储"指向某物的指针",请使用void*