此代码显示char需要4个字节:

println!("char : {}", std::mem::size_of::<char>());
  1. 为什么需要4个字节?.
  2. 大小取决于平台,还是始终为4字节?
  3. 如果总是4个字节,那是为了什么特别的东西?
  4. 编译器是否保证大小为char的最小大小?

In 100 I also get 4 bytes

推荐答案

首先:Rust中的char是表示Unicode标量值的唯一整数值.例如,考虑?(一堆POO,又名U+1F4A9),在 rust 蚀中,它将用char表示,小数值为128169(即十六进制中的0x1F4A9):

fn main() {
    let c: char = "?".chars().next().unwrap();
    println!("? is {} ({})", c, c as u32);
}

On the playpen

也就是说,Rust char是4字节,因为4字节是2个字节的最小幂,可以保存任何Unicode标量值的整数值.这个决定是由领域驱动的,而不是由架构约束驱动的.


Note: the emphasis on Scalar value is that a number of "characters" as we see them are actually graphemes composed by multiple combining characters in Unicode, in this case multiple 100 are required.

Rust相关问答推荐

在HashMap中插入Vacant条目的可变借位问题

如何在Rust中实现Functor trait?

如何为utoipa中的可选查询参数生成OpenAPI模式?

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

通过不同的字段进行散列和排序的 struct (需要不同的EQ实现)

有没有办法避免在While循环中多次borrow `*分支`

将Vec<;U8&>转换为Vec<;{Float}&>

如何设置activx websocket actorless的消息大小限制?

在为第三方 struct 实现第三方特征时避免包装器的任何方法

如何从宏调用闭包?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

将引用移动到线程中

中文优化标题:跳出特定循环并返回一个值

枚举的利基优化如何在 Rust 中工作?

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

为什么 File::read_to_end 缓冲区容量越大越慢?

为什么具有 Vec 变体的枚举没有内存开销?

`use std::error::Error` 声明中断编译

如何使用 rust bindgen 生成的 std_vector

如何阅读 HttpRequest 主体