Rust中的usize / isize类型是否保证始终为32位或64位?

jhp*_*ING 3 rust

如果我编译针对16位体系结构的程序,将std::mem::size_of::<usize>()返回2,还是可以保证(通过规范,RFC或其他方式)始终返回4或8?

Fra*_*gné 8

这是Rust参考必须说的usize

usize并且isize其大小足以容纳目标平台上的每个地址。例如,在32位目标上,这是4个字节,在64位目标上,这是8个字节。

请注意,措词不排除4字节或8字节以外的大小。实际上,Rust已经支持 16位平台usizemsp430-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!() }
}
Run Code Online (Sandbox Code Playgroud)


jhp*_*ING 6

目前看来答案是否定的,基于rust-lang/rust#1748。该问题涉及关于 的大小的假设usize,并且当前是开放的(并且隐含地未解决)。所有具有第 1 层支持的平台目前都是 32 位或 64 位 [参考]。

然而,rust-lang/rust#49305假设指针至少为 16 位。这不是基于任何 Rust RFC 或规范,正如提到的那样

C99 标准支持 [转换的] 无误性,该标准(间接)要求指针至少为 16 位。

由于这种拉请求,在2018年合并了,看来这是当前的(虽然非官方的)政策是usizeisize可以被假定为至少16位,这意味着std::mem::size_of::<usize>()不能保证返回4或8相反,它似乎它已经可以返回 2,尽管这似乎是下限。