哪种整数类型可以安全且便携式用于始终保持指针值
Which integer type can be safely and portably used to always hold a pointer value
可以安全地使用哪种整数类型始终保持指针值?是std::intptr_t
吗?但是我认为int
也将始终保持指针值并存在于每个构建中,并且如果输入大小不准确,则可以更改诸如int32_t
或int64_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
您还应该考虑为什么您首先想做这样的事情。我可以想到一些原因:
- 为了计算地址的对齐。这是不再需要的,因为具有
std::align
的C 11。 - 为了将整数进一步转换为用于调试目的的字符串。标准库已经有将指针转换为字符串的方法(
std::printf
功能和字符流家族)。但是这些在所有情况下都不可用(信号处理程序;独立实现),因此在这些情况下进行整数转换的指针可能是有道理的。 - 计算哈希。
std::hash
(C 11)已经有针对指针的专业化,但是如果您发现标准库实现不足,则可以在转换为整数后使用自定义哈希功能。 - 将数据存储在"未使用"中指针的位。这种优化技术高度依赖于实施。可以使用比对准大于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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 使用GlclearBufferdata用于复合数据类型的便携式
- 一个好的,简单的,便携式的解决方案,用于等待输入C++
- 用于 pbm 文件的预编码字符和数字资源(便携式位图)
- 编译适用于Windows Phone 8.1或10的便携式UPnP库