mem::size_of() 与 mem::size_of_val() 函数

它们用于获取对象的内存大小.

差别在于:

  • size_of::(), 获取指定类型的内存大小
  • size_of_val(val), 获取某个值的内存大小

它们的函数接口如下:

#![allow(unused)]
fn main() {
pub const fn size_of<T>() -> usize;
pub fn size_of_val<T>(val: &T) -> usize where T: ?Sized;
}

其用法可以参看下面的代码片段:

#![allow(non_camel_case_types)]

use std::mem::size_of;

#[repr(C)]
pub struct linux_dirent_c_t {
    pub d_ino: u64,
    pub d_off: i64,
    pub d_reclen: u16,
    pub d_name: [u8; 1],
}

fn main() {
    assert_eq!(size_of::<linux_dirent_c_t>(), 24);
}

对应的 C 代码如下:

#include <stdint.h>
#include <stddef.h>
#include <assert.h>

struct linux_dirent_s {
  uint64_t u64;
  int64_t d_off;
  uint16_t d_reclen;
  char d_name[];
};

int main() {
  assert(sizeof(struct linux_dirent_s) == 24);
  return 0;
}

常见类型的内存大小

基础数据类型占用的内存大小, 如下表所示:

Tsize_of::C 语言中对应的类型
()0void, 它是 zero sized type, ZST
bool1
u81unisigned char
i81signed char
u162unsigned short
i162short
u324unsigned int
i324int
u648unsigned long
i648long
usize8size_t
isize8isize_t
u12816-
i12816-
char4-
[T; N ]N * siz_of::()T[N]
&T8-
&mut T8-
*const T8const T*
*mut T8T*
Box8-
dyn Trait16-

备注: 以上表格中的数据来自于 64 位的操作系统, 比如 x86_64, aarch64 或者 riscv64.