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++