我正在做一些 C++ 工作,需要我将“正常”(广泛使用的)数据类型(如 int
)转换为它们的固定大小对应点,如 std::int32_t
。但是,我有一些使用 void*
的代码,这给我带来了麻烦。
我知道任何给定指针的大小在给定系统上都是相同的 - 为 future 的读者编辑:有人指出,不能保证大小,指针的绝对或相对。sizeof(void*) == sizeof(int*) == sizeof(short*) == sizeof(long* )
。但我也知道指针的大小可能因系统而异(特别是 32 位与 64 位)。
是否有能够容纳 void*
的固定大小类型?我认为 std::intptr_t
或 std::uintptr_t
是潜在的候选者,但我不确定哪个(如果有的话)是正确的。这主要是由于签名;我不确定为什么会有签名和未签名形式的 intptr_t
,因为我不认为指针的签名是可以控制的。本能告诉我要使用 uintptr_t
,因为我不相信指针可以被签名,但是 intptr_t
有什么用?
关于我的需求的更多信息:我正在处理一个 DLL,如果可能的话需要保证交叉编译器的能力。对于基于整数的类型,这还算不错;我能够在幕后将它们转换为 std::intXX_t
类型。但是我的 DLL 函数之一执行一些原始内存操作并且需要返回 void*
。我担心如果我不能正确包装它会给我带来各种各样的麻烦,但我不知道用什么包装它用:我找不到任何类型关于指针的大小或数据范围的保证。我知道内存本身可以在 DLL 之外访问;这不是问题。但是确保 void*
可以从主机 EXE 安全地获取到我的 DLL,反之亦然,这是一个更大的问题。
最佳答案
intptr_t 和 uintptr_t 不是固定大小的类型,因此它们不能满足您声明的目的。您特别要求“能够容纳 void*
的固定大小类型”。这不是 100% 可能的,因为我们不知道 future 系统的指针大小是多少(128 位很可能会在我们的有生之年出现)。
我建议你使用 uint64_t,并添加一个 static_assert(sizeof(void*) <= sizeof(uint64_t))
.有人可能会说,即使断言通过,也不能保证将 void* 放入 uint64_t 将在所有平台上工作,但我认为它足以满足所有实际用途。
关于c++ - 有没有等同于 void* 的固定大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22352659/