c++ - 有没有等同于 void* 的固定大小?

标签 c++ pointers c++11

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

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

是否有能够容纳 void* 的固定大小类型?我认为 std::intptr_tstd::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/

相关文章:

c++ - 使用 boost::karma 格式化纬度/经度字符串

c++ - 将结构指针复制到指针

c - 当我尝试打印(复制的)字符串时,为什么会得到一些任意数字?

c++11 - gcc 7.2.0 无法识别 std::expf 和 std::logf

c++ - 在编译时将 std::array 的每个元素相乘

c++ - 是否可以在可变参数模板函数中扩展非可变参数?

c++ - std::thread 类方法错误

haskell - C++11 相当于 Haskell 的 "inits"

c++ - 提示用户说明

c++ - 使用 malloc : why did it happen? 的内存分配导致堆损坏