字面量(Literals)

数值字面量可以追加类型后缀来标注类型。

举个例子:如果想让字面量 42 的类型为 i32,写成 42i32

不带后缀的数值字面量,类型取决于它的使用场景。如果编译器无法推断出约束条件,整数默认类型为 i32,浮点数默认类型为 f64

看例子

fn main() {
    // 带后缀字面量:初始化时类型就已经确定
    let x = 1u8;
    let y = 2u32;
    let z = 3f32;

    // 无后缀字面量:类型由上下文使用方式决定
    let i = 1;
    let f = 1.0;

    // size_of_val 返回变量占用的字节大小
    println!("size of `x` in bytes: {}", std::mem::size_of_val(&x));
    println!("size of `y` in bytes: {}", std::mem::size_of_val(&y));
    println!("size of `z` in bytes: {}", std::mem::size_of_val(&z));
    println!("size of `i` in bytes: {}", std::mem::size_of_val(&i));
    println!("size of `f` in bytes: {}", std::mem::size_of_val(&f));
}Code language: Rust (rust)

输出结果

size of `x` in bytes: 1
size of `y` in bytes: 4
size of `z` in bytes: 4
size of `i` in bytes: 4
size of `f` in bytes: 8Code language: JavaScript (javascript)

1. 带后缀数值字面量(Suffixed literals)

语法:数值 + 类型后缀

  • 1u8:无符号 8 位整数(1 字节)
  • 2u32:无符号 32 位整数(4 字节)
  • 3f32:32 位单精度浮点数(4 字节)

特点:类型固定,编译器无需推断

2. 无后缀数值字面量(Unsuffixed literals)

let i = 1;     // 默认 i32(有符号32位整数,4字节)
let f = 1.0;   // 默认 f64(64位双精度浮点数,8字节)Code language: Rust (rust)

如果上下文能推导出类型,则覆盖默认类型

let num: u64 = 100; // 虽然字面量100不带后缀,但是标注类型为u64,最终是u64Code language: Rust (rust)

3. std::mem::size_of_val(&变量)

  • 参数:引用 &var(获取变量地址,不转移所有权)
  • 返回值:该变量在内存占用的字节数量
  • 配套函数:std::mem::size_of::<T>(),获取类型 T 本身大小(不需要变量)
std::mem::size_of_val(&x); // 变量x占用大小
std::mem::size_of::<u8>(); // u8类型占用大小Code language: Rust (rust)

4. 路径、模块、crate 简单理解

  • std:Rust 标准库 crate(最大内置代码包)
  • std::mem:std 包下的 mem 内存操作模块
  • std::mem::size_of_val:完整绝对路径调用函数

后续可以用 use 简化路径,不用每次写全路径:

use std::mem::size_of_val;

println!("{}", size_of_val(&x));Code language: Rust (rust)

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注