如果我编译针对16位体系结构的程序,std::mem::size_of::<usize>()
将返回2,还是可以保证(通过规范,RFC或其他方式)总是返回4或8?
答案 0 :(得分:8)
The Rust Reference对usize
的评价是这样的:
usize
和isize
的大小足以容纳目标平台上的每个地址。例如,在32位目标上,这是4个字节,而在64位目标上,这是8个字节。
请注意,措词不排除4字节或8字节以外的大小。实际上,Rust已经supports a platform带有16位usize
:msp430-none-elf
(MSP430是16位微控制器)。
如果要基于指针的大小执行条件编译,则可以使用target_pointer_width
配置选项。以下是core
库中的示例用法:
#[cfg(target_pointer_width = "16")]
#[lang = "usize"]
impl usize {
uint_impl! { usize, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
"[0x34, 0x12]", "[0x12, 0x34]",
usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
}
#[cfg(target_pointer_width = "32")]
#[lang = "usize"]
impl usize {
uint_impl! { usize, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
"0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]",
usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
}
#[cfg(target_pointer_width = "64")]
#[lang = "usize"]
impl usize {
uint_impl! { usize, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
"0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
"[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
"[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
}
答案 1 :(得分:4)
基于rust-lang/rust#1748,答案似乎是否。该问题基于usize
大小的假设,目前尚待解决(并且尚待解决)。当前所有支持1级的平台都是32或64位[ref]。
但是,rust-lang/rust#49305假定指针至少为16位。那不是基于任何Rust RFC或规范的 ,
[转换的]绝对性受C99标准支持,该标准(间接地)要求指针至少为16位。
随着此拉取请求于2018年合并,这似乎是当前(尽管是非正式的)政策,即usize
和isize
至少应为16位,这意味着{ {em}不能保证返回4或8。相反,似乎已经可以返回2,尽管这似乎是下限。