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;
}
常见类型的内存大小
基础数据类型占用的内存大小, 如下表所示:
T | size_of:: | C 语言中对应的类型 |
---|---|---|
() | 0 | void, 它是 zero sized type, ZST |
bool | 1 | |
u8 | 1 | unisigned char |
i8 | 1 | signed char |
u16 | 2 | unsigned short |
i16 | 2 | short |
u32 | 4 | unsigned int |
i32 | 4 | int |
u64 | 8 | unsigned long |
i64 | 8 | long |
usize | 8 | size_t |
isize | 8 | isize_t |
u128 | 16 | - |
i128 | 16 | - |
char | 4 | - |
[T; N ] | N * siz_of:: | T[N] |
&T | 8 | - |
&mut T | 8 | - |
*const T | 8 | const T* |
*mut T | 8 | T* |
Box | 8 | - |
dyn Trait | 16 | - |
备注: 以上表格中的数据来自于 64 位的操作系统, 比如 x86_64, aarch64 或者 riscv64.