Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪种整数类型可以安全且可移植地用于始终保存指针值_C++ - Fatal编程技术网

C++ 哪种整数类型可以安全且可移植地用于始终保存指针值

C++ 哪种整数类型可以安全且可移植地用于始终保存指针值,c++,C++,哪种整数类型可以安全地用于始终保存指针值?会是std::intptr\t?但是我认为int也将始终保持一个指针值,并且在每个构建中都会出现,如果输入大小不准确,则int32\u t或int64\u t之类的内容将被更改,是的,std::intptr\t是一个更好的选择。它被定义为不同的宽度,以便在x64或x86系统上将地址另存为指针 // Definitions of common types #ifdef _WIN64 typedef unsigned __int64 size_t;

哪种整数类型可以安全地用于始终保存指针值?会是
std::intptr\t
?但是我认为
int
也将始终保持一个指针值,并且在每个构建中都会出现,如果输入大小不准确,则
int32\u t
int64\u t
之类的内容将被更改,是的,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
哪种整数类型可以安全且可移植地用于始终保存指针值:

会是std::intptr\t吗

将指针值存储在整数中的整个思想并不一定能够完全移植到所有系统

std::intptr\u t
是提供该服务的系统上最合适的选择。相应地,
std::uintpttr\t

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

你错了
int
不能保证始终能够表示所有指针值。事实上,在-where指针是64位-
int
是32位

为了说明原因,这里有一个文档概述了UNIX/POSIX的原因:


你也应该首先考虑为什么要做这样的事情。我可以想出几个理由:

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

  • 为什么?使用
    void*
    。如果要使用整数类型,最好选择
    size\u t
    。可能会重复、、等。还应注意旧的内存模型,如x86分段地址。如果我记得,
    size\u t
    和指针的大小不同(这在实践中几乎从来都不是问题)。除了
    intptr\u t
    uintpr\u t
    在标准中是可选的。对于某些体系结构,可能无法用支持的整数表示地址。所以不是100%可移植的,但至少它们要么按预期工作,要么无法编译。@aschepler我把你的一些观点纳入了我的答案中。出于好奇,你知道有任何这样的体系结构,它也有一个C++编译器吗?我不知道其中一个。我收集了所有数据中的一个,CAR/BIT/INT/LIG/LILLION/PTR总是8, 16, 32个,或者64个比特(虽然有时有指针的填充)。请注意,指针的种类可能不止一种(如
    near
    vs
    far
    ),非默认指针可能由int24\t或标准C中不存在的类似类型支持,也可能不由int24\t或类似类型支持。@eerorika我知道整数存储指针的一种用法:节省空间。这里有巨大的建筑,比如。每个子项的最低有效位表示该子项是否为反,而所有其他位包含该子项的地址。在BDD中,RAM耗尽的情况并不少见,因此每一位都很重要。但它的定义方式并不能保证OP想要什么。