哪种整数类型可以安全且便携式用于始终保持指针值

Which integer type can be safely and portably used to always hold a pointer value

本文关键字:用于 便携式 始终保持 指针 安全 整数 类型      更新时间:2023-10-16

可以安全地使用哪种整数类型始终保持指针值?是std::intptr_t吗?但是我认为int也将始终保持指针值并存在于每个构建中,并且如果输入大小不准确,则可以更改诸如int32_tint64_t之类的内容。

哪种整数类型可以安全,便便用于始终保持指针值:

是std :: intptr_t?

将指针值存储在整数中的整个想法不一定适合所有系统。

std::intptr_t是提供的系统上最合适的选择。相应地,std::uintptr_t

,但我认为int也将始终保持指针值

你错了。int不能保证始终能够表示所有指针值。实际上,在最常见的64位系统上 - 指针为64位 - int是32位。

对于推理为什么也是,这是一个文档,概述了unix/posix的原因:http://www.unix.org/whitepapers/64bit.html


您还应该考虑为什么您首先想做这样的事情。我可以想到一些原因:

  1. 为了计算地址的对齐。这是不再需要的,因为具有std::align的C 11。
  2. 为了将整数进一步转换为用于调试目的的字符串。标准库已经有将指针转换为字符串的方法(std::printf功能和字符流家族)。但是这些在所有情况下都不可用(信号处理程序;独立实现),因此在这些情况下进行整数转换的指针可能是有道理的。
  3. 计算哈希。std::hash(C 11)已经有针对指针的专业化,但是如果您发现标准库实现不足,则可以在转换为整数后使用自定义哈希功能。
  4. 将数据存储在"未使用"中指针的位。这种优化技术高度依赖于实施。可以使用比对准大于1的指针的低阶指针。16高级钻头可以在X86-64体系结构中使用(将来可能会收缩到[可能是7]:https://software.intel.com/sites/default/default/files/files/managed/2B/80/5-level_paging_paging_paging_paging_paging_white_white_paper.pdf)。

是的,std :: intptr_t是一个更好的选择。它被定义为不同的宽度,将地址保存为x64或x86系统上的指针。


// Definitions of common types
#ifdef _WIN64
    typedef unsigned __int64 size_t;
    typedef __int64          ptrdiff_t;
    typedef __int64          intptr_t;
#else
    typedef unsigned int     size_t;
    typedef int              ptrdiff_t;
    typedef int              intptr_t;
#endif