Determining 32 vs 64 bit in C++
时间:2022-07-25
本文章向大家介绍Determining 32 vs 64 bit in C++,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
跨平台 32bits/64bits
如何区分32位和64位操作系统平台
常见的方式:
1.根据宏来进行区分
// check win
#if _WIN32 || _WIN64
#if _WIN64
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
// check GCC
#if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
2.size of pointer 通常情况下,在32位平台上一个指针的宽度为4bytes,而在64位平台上位8bytes.
#if sizeof(char *) == 8
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
3.如果不允许使用sizeof 根据栈指针变量宽度来判断,对指针变量地址相减时,须将其转换为char*,否则相减的结果为1。表示地址间隔 内存放元素的个数。代码如下:
std::string getPlatform()
{
void *a;
void *b;
int size = (char *)&a - (char *)&b;
if(size == 8) return "64bits"
else return "32bits"
}
深入理解
在32位和64位平台上,对于数据类型除了指针的宽度不一样之外,还有其它类型也会有差别。比如整型:
C ++标准未指定整数类型的大小(以字节为单位),但指定了它们必须能够容纳的最小范围。
可以在<limits.h>
in C, or <climits>
in C++ (or even better, templated std::numeric_limits
in <limits>
header).查询实际的类型范围.
//C:
#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;
//C++:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
所以可以通过整数类型的大小范围来区别32还是64位,带入如下:
#include <cstdint>
#if INTPTR_MAX == INT32_MAX
#define THIS_IS_32_BIT_ENVIRONMENT
#elif INTPTR_MAX == INT64_MAX
#define THIS_IS_64_BIT_ENVIRONMENT
#else
#error "Environment not 32 or 64-bit."
#endif
其它优雅的方法
另外对于32bits和64bits的函数可以采用如下模板形式,而不是宏的形式:
template<int> void DoMyOperationHelper();
template<> void DoMyOperationHelper<4>()
{
// do 32-bits operations
}
template<> void DoMyOperationHelper<8>()
{
// do 64-bits operations
}
// helper function just to hide clumsy syntax
inline void DoMyOperation() { DoMyOperationHelper<sizeof(size_t)>(); }
int main()
{
// appropriate function will be selected at compile time
DoMyOperation();
return 0;
}
参考文档
determining-32-vs-64-bit-in-c++
- 在运算符重载++,--,+=,-=...
- 排序一栏(总结帖)
- 编程思想 之「异常及错误处理」
- nyoj-----284坦克大战(带权值的图搜索)
- nyoj-----42一笔画问题
- hdu-------1081To The Max
- nyoj------170网络的可靠性
- HDUOJ-------1052Tian Ji -- The Horse Racing(田忌赛马)
- 初学Java之Pattern与Matcher类
- 初学java之StringBuffer类的常用方法
- 初学java之大数处理
- hdu---1024Max Sum Plus Plus(动态规划)
- Go语言异步服务器框架原理和实现
- nyoj------布线问题(kruscal+求最小值)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法