可以安全且方便地使用哪种整数类型来始终保存指针值

时间:2019-03-19 01:09:58

标签: c++

可以安全地使用哪种整数类型来始终保存指针值?是std::intptr_t吗?但是我认为int还将始终保留一个指针值,并且在每个版本中都存在,并且如果输入大小不正确,int32_tint64_t之类的东西将被更改

2 个答案:

答案 0 :(得分:4)

  

可以安全且方便地使用哪种整数类型来始终保存指针值:

     

会是std :: intptr_t吗?

以整数存储指针值的整个想法不一定完全适用于所有系统。

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

  

但是我认为int也会始终保留一个指针值

您误会了。不能保证int总是能够代表所有指针值。实际上,在most common 64 bit systems上-指针是64位-int是32位。

出于推理原因为什么,这是概述UNIX / POSIX情况的原因的文档:http://www.unix.org/whitepapers/64bit.html


您还应该首先考虑为什么。我可以想到一些原因:

  1. 为了计算地址的对齐方式。自C ++ 11具有std::align以来,这不再是必需的。
  2. 为了进一步将整数转换为字符串以进行调试。标准库已经具有将指针转换为字符串的方法(std::printf系列函数和字符流)。但是,并非在所有上下文中都可用(信号处理程序;独立的实现),因此在这些上下文中指向整数转换的指针可能有意义。
  3. 计算哈希。 std::hash(C ++ 11)已经对指针进行了专门化,但是如果您发现标准库实现不足,可以在转换为整数后使用自定义哈希函数。
  4. 将数据存储在指针的“未使用”位中。此优化技术高度依赖于实现。可以使用对齐大于1的指针的低位。在x86-64体系结构中可以使用16个高阶位(将来可能会缩小到[可能降至7]:https://software.intel.com/sites/default/files/managed/2b/80/5-level_paging_white_paper.pdf)。

答案 1 :(得分:-1)

是的,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