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++
- 用Keras通过Python进行卷积神经网络的手写数字识别
- 反射的另类实现。(不知道这么用还算不算反射了?)
- 如何让普通变量也支持事务回滚?
- What is "Type" in managed heap?
- 一个特殊场景的 LR 预测优化 Trick
- 你知道Unity IoC Container是如何创建对象的吗?
- 发布一个锁定行列的一种方法。(实现Excel里的冻结窗格的功能)
- IoC+AOP的简单实现
- 使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。[已经增加了实现的代码]
- OO——从不知到知道一点,从迷茫到豁然开朗 (迟来的我的2002到2007)
- 只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题
- TEST LAB V8在线渗透实验室教程(三)
- CMQ请求域名
- 在Entity Framework中使用存储过程(一):实现存储过程的自动映射
- 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 数组属性和方法
- 绝了!Python定时爬取微博热搜+pyecharts动态图展示
- 实战 | Python爬取B站柯南弹幕+Gephi梳理主线剧情
- 别再问我 Python 怎么识别数字验证码了!
- Python自动化办公 | 同事要我帮忙补写178份Word日报!别闹!
- Excel多区间判断,其实很简单
- 外观模式
- cp命令
- java基本数据类型及相互间的转换(转)
- 【java设计模式系列】1. 工厂方法模式(Factory Method)
- 为什么 Java 中 1000==1000 为 false ?
- 【java设计模式系列】2. 单例模式(Singleton)
- 跨域请求的解决方案
- 【排序】快速排序
- 因为BitMap,白白搭进去8台服务器...
- java所有的“锁”大总结,以后面试再也不怕遇到锁了