如何检测 C/C 中的机器字长?

新手上路,请多包涵

是否有一种或多或少可靠的方法(不一定是完美的)来检测我正在编译的 目标架构 的 _机器字长_?

机器字大小 是指整数累加器寄存器的大小(例如 x86 上的 EAX、x86_64 上的 RAX 等, 而不是 流扩展、段或浮点寄存器)。

该标准似乎没有提供“机器字”数据类型。所以我 不是 在寻找一种 100% 可移植的方式,只是在最常见的情况下工作(Intel x86 Pentium+、ARM、MIPS、PPC——即基于寄存器的现代商品处理器)。

size_tuintptr_t 听起来像不错的候选者(实际上与我测试的所有地方的寄存器大小相匹配)但当然是其他东西,因此不能保证总是这样做,正如已经描述的那样在 size_t 是单词大小

语境

假设我在一块连续的数据上实现了一个散列循环。生成的哈希值取决于编译器是可以的,只有速度很重要。

示例: http ://rextester.com/VSANH87912

在 Windows 上进行的测试表明,64 位块的散列在 64 位模式和 32 位模式下的 32 位中更快:

 64-bit mode
int64: 55 ms
int32: 111 ms

32-bit mode
int64: 252 ms
int32: 158 ms

原文由 rustyx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

我想你想要

sizeof(size_t) 这应该是索引的大小。 IE。 ar[index]

32 bit machine

 char 1
int 4
long 4
long long 8
size_t 4

64 bit machine

 char 1
int 4
long 8
long long 8
size_t 8

它可能更复杂,因为 32 位编译器在 64 位机器上运行。他们的输出 32 即使机器有更多的能力。

我在下面添加了 Windows 编译器

Visual Studio 2012 compiled win32

 char 1
int 4
long 4
long long 8
size_t 4

Visual Studio 2012 compiled x64

 char 1
int 4
long 4
long long 8
size_t 8

原文由 Robert Jacobs 发布,翻译遵循 CC BY-SA 3.0 许可协议

因为 C 和 C++ 语言有意抽象出机器字长等考虑因素,所以任何方法都不太可能 100% 可靠。但是,有各种 int_fastXX_t 类型可以帮助您推断大小。例如,这个简单的 C++ 程序:

 #include <iostream>
#include <cstdint>

#define SHOW(x) std::cout << # x " = " << x << '\n'

int main()
{
    SHOW(sizeof(int_fast8_t));
    SHOW(sizeof(int_fast16_t));
    SHOW(sizeof(int_fast32_t));
    SHOW(sizeof(int_fast64_t));
}

在我的 64 位 Linux 机器上使用 gcc 版本 5.3.1 产生这个结果:

 sizeof(int_fast8_t) = 1
sizeof(int_fast16_t) = 8
sizeof(int_fast32_t) = 8
sizeof(int_fast64_t) = 8

这表明发现寄存器大小的一种方法可能是寻找所需大小(例如 16 位值的 2 个字节)和相应的 int_fastXX_t 大小之间的最大差异,并使用 int_fastXX_t 作为寄存器大小。

进一步的结果

Windows 7,64 位机器上 Cygwin 下的 gcc 4.9.3:同上

64 位计算机上的 Windows 7、Visual Studio 2013 (v 12.0):

 sizeof(int_fast8_t) = 1
sizeof(int_fast16_t) = 4
sizeof(int_fast32_t) = 4
sizeof(int_fast64_t) = 8

Linux,32 位 ARM 上的 gcc 4.6.3 和 Linux,32 位 Atom 上的 gcc 5.3.1:

 sizeof(int_fast8_t) = 1
sizeof(int_fast16_t) = 4
sizeof(int_fast32_t) = 4
sizeof(int_fast64_t) = 8

原文由 Edward 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题