如何在Rust中检查架构是32位还是64位?

9

是否有一个条件检查来判断处理器是32位还是64位?我正在寻找类似于#cfg[x86]cfg[x64]的配置检查。


1
你想在编译时检测它(以启用/禁用不同的功能),还是运行时检测就足够了?后者可以使用 if mem::size_of::<usize>() == 8 来完成(并将被优化掉)。 - Matthieu M.
在编译时禁用部分代码。 - Daniel Fath
2个回答

16

来自Rust参考手册cfg部分的#[cfg(target_pointer_width = "64")]看起来是一个很可能的解决方案。它基于指针的大小(以及isizeusize),这应该对应于架构。


3
“which should correspond to the architecture” 并不总是成立。例如,AVR芯片具有16位指针,但只是一个8位的架构。 - Shepmaster
那么答案也不是吗? - Daniel Fath
4
你所提出的问题不够具体。为什么你关心“架构”?如果你关注指针的大小,那是一个问题。如果你关注其他方面,那么“target_arch”可能是正确的选择。如果你关心整数的本机CPU大小,则我不知道答案。 - Shepmaster
块排序使用术语64位系统来定义FloorOfTwo函数。我不确定在这个上下文中64位会有什么意义?https://en.wikipedia.org/wiki/Block_sort#Algorithm - Daniel Fath
1
那似乎是对算法的一个不好的解释。它可能并不意味着如果系统是64位,而是意味着如果一个特定的值有一定数量的位数。在这些例子中,它总是与数组长度一起调用。由于在Rust中这是一个usize,所以您关心的是usize的大小。虽然您可能只需使用usize::next_power_of_two - Shepmaster
很遗憾,usize::next_power_of_two会给出不同的结果。该算法需要较小的2的幂次方,例如63u8.next_power_of_two()应该是32而不是64。虽然一些next_power_of_two和移位的组合可能有效。 - Daniel Fath

7
你应该查看 Rust 参考手册上关于条件编译的章节:链接

target_arch = "..." - 目标 CPU 架构,例如 "x86""x86_64""mips""powerpc""powerpc64""arm""aarch64"。这个值与平台目标三元组的第一个元素密切相关,但并不相同。


这些 target_arch 值有完整的列表吗?可以在 platform support 中找到 target triples 的列表,但是这个 target_arch 似乎没有很好的文档记录。 - Steve Lau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接