是否有固定大小的等效于void*?

cf *_*ica 0 c++ pointers c++11

我正在做一些C++工作,需要我将"普通"(广泛使用)数据类型转换为int固定大小的对应点,例如std::int32_t.void*但是,我有一些使用的代码,这给我带来了麻烦.

我知道任何给定指针的大小在给定系统上是相同的 - sizeof(void*) == sizeof(int*) == sizeof(short*) == sizeof(long*).但我也知道指针的大小可能因系统而异(特别是32位与64位).为未来的读者编辑:有人指出,指针的大小,绝对或相对性都没有保证.

是否有固定尺寸类型能够持有void*?我认为std::intptr_t或是std::uintptr_t潜在的候选人,但我不确定哪一个(如果有的话)是正确的.这主要是由于签字; 我不确定为什么有签名和无符号形式intptr_t,因为我没有印象中指针的签名可以控制.Instinct说我想要使用,uintptr_t因为我不相信指针可以签名,但那么它有什么intptr_t用?


关于我的需求的更多信息:我正在研究DLL,并且如果可能的话需要保证交叉编译器功能.对于基于整数的类型,这不是太糟糕; 我能够将它们转换为std::intXX_t幕后类型.但我的DLL函数之一做了一些原始的内存操作,需要返回一个void*.我很担心这导致我各种各样的麻烦,如果我不能正确地包装它,但我不知道是什么把它包起来:我已经无法找到任何形式的有关大小或数据的保证指针范围.我知道内存本身可以在DLL外部访问; 这不是问题.但确保一个void*可以从主机EXE到我的DLL,或反之亦然,安全是一个更大的问题.

Joh*_*nck 5

intptr_t和uintptr_t不是固定大小的类型,因此它们不足以满足您的声明目的.您特别要求"能够容纳一个固定尺寸的类型void*".这不是100%可能,因为我们不知道将来的系统会有什么样的指针大小(128位可能会在我们的生命周期内发生).

我建议你使用uint64_t,并添加一个static_assert(sizeof(void*) <= sizeof(uint64_t)).有人可能会说,无法保证将void*放入uint64_t可以在所有平台上工作,即使断言通过,但我认为这对所有实际用途都足够好.