【发布时间】:2016-06-20 23:32:49
【问题描述】:
是否有一种或多或少可靠的方法(不一定完美)来检测我正在为其编译的目标架构的机器字长?
机器字大小我指的是整数累加器寄存器的大小(例如 x86 上的 EAX、x86_64 上的 RAX 等,不是流扩展、段或浮动-点寄存器)。
该标准似乎没有提供“机器字”数据类型。所以我不是在寻找一种 100% 可移植的方式,只是在最常见的情况下工作(Intel x86 Pentium+、ARM、MIPS、PPC - 即基于寄存器的现代商品处理器) .
size_t 和 uintptr_t 听起来像是不错的候选者(实际上与我测试的所有地方的寄存器大小相匹配)但当然是其他东西,因此不能保证总是这样做,正如 Is size_t the word size 中已经描述的那样。
上下文
假设我正在对一个连续数据块实施散列循环。生成的哈希值取决于编译器是可以的,只有速度很重要。
示例: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
【问题讨论】:
-
您仍然可以混合来自编译器和具有特定宏的体系结构的信息。
-
@stark sizeof(long) 在 64 位 Windows 数据模型上为 4(32 位)。
-
重新上下文 - 问题很清楚 - 我如何确定机器字长。然后可以将答案应用于多种不同的上下文。
-
您为什么需要知道?你想用这些信息做什么?如果我在某个平台上告诉您一个不正确的字长,它将如何影响您尝试做的任何事情?
标签: c++ c cpu-registers