mem::size_of() 与 mem::size_of_val() 函数
它们用于获取对象的内存大小.
差别在于:
- size_of::
(), 获取指定类型的内存大小 - size_of_val(val), 获取某个值的内存大小
它们的函数接口如下:
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.