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的原因:
你也应该首先考虑为什么要做这样的事情。我可以想出几个理由:
std::align
,因此不再需要这样做std::printf
函数和字符流系列)。但并非在所有上下文(信号处理程序;独立实现)中都可用,因此整数转换指针在这些上下文中可能有意义std::hash
(C++11)已经对指针进行了专门化,但如果发现标准库实现不足,可以在转换为整数后使用自定义哈希函数为什么?使用
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
vsfar
),非默认指针可能由int24\t或标准C中不存在的类似类型支持,也可能不由int24\t或类似类型支持。@eerorika我知道整数存储指针的一种用法:节省空间。这里有巨大的建筑,比如。每个子项的最低有效位表示该子项是否为反,而所有其他位包含该子项的地址。在BDD中,RAM耗尽的情况并不少见,因此每一位都很重要。但它的定义方式并不能保证OP想要什么。