前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Determining 32 vs 64 bit in C++

Determining 32 vs 64 bit in C++

原创
作者头像
Rock_Lee
修改2020-09-23 10:17:12
9330
修改2020-09-23 10:17:12
举报
文章被收录于专栏:知识碎片知识碎片

跨平台 32bits/64bits

如何区分32位和64位操作系统平台

常见的方式:

1.根据宏来进行区分

代码语言:txt
复制
// 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.

代码语言:txt
复制
#if sizeof(char *) == 8
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif

3.如果不允许使用sizeof 根据栈指针变量宽度来判断,对指针变量地址相减时,须将其转换为char*,否则相减的结果为1。表示地址间隔 内存放元素的个数。代码如下:

代码语言:txt
复制
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).查询实际的类型范围.

代码语言:txt
复制
//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位,带入如下:

代码语言:txt
复制
#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的函数可以采用如下模板形式,而不是宏的形式:

代码语言:txt
复制
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++

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 跨平台 32bits/64bits
    • 如何区分32位和64位操作系统平台
      • 深入理解
        • 其它优雅的方法
        • 参考文档
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档