Struct std::alloc::System

1.28.0 · source ·
pub struct System;
Expand description

操作系统提供的默认内存分配器。

它基于 Unix 平台上的 malloc 和 Windows 上的 HeapAlloc,以及相关的函数。 但是,将支持系统分配器与 System 混合使用是无效的,因为此实现可能包括额外的工作,例如提供比支持系统分配器直接提供的对齐更大的对齐请求。

此类型默认情况下实现 GlobalAlloc trait 和 Rust 程序,就像它们具有以下定义一样:

use std::alloc::System;

#[global_allocator]
static A: System = System;

fn main() {
    let a = Box::new(4); // 从系统分配器分配。
    println!("{a}");
}
Run

如果愿意,还可以围绕 System 定义自己的包装器,例如跟踪分配的所有字节数:

use std::alloc::{System, GlobalAlloc, Layout};
use std::sync::atomic::{AtomicUsize, Ordering::Relaxed};

struct Counter;

static ALLOCATED: AtomicUsize = AtomicUsize::new(0);

unsafe impl GlobalAlloc for Counter {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        let ret = System.alloc(layout);
        if !ret.is_null() {
            ALLOCATED.fetch_add(layout.size(), Relaxed);
        }
        ret
    }

    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        System.dealloc(ptr, layout);
        ALLOCATED.fetch_sub(layout.size(), Relaxed);
    }
}

#[global_allocator]
static A: Counter = Counter;

fn main() {
    println!("allocated bytes before main: {}", ALLOCATED.load(Relaxed));
}
Run

它也可以直接用于独立于 Rust 程序选择的分配器来分配内存。 例如,如果 Rust 程序选择使用 jemalloc 作为分配器,则 System 仍将使用 mallocHeapAlloc 分配内存。

Trait Implementations§

source§

impl Allocator for System

source§

fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)
尝试分配一块内存。 Read more
source§

fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)
行为类似于 allocate,但也确保返回的内存被零初始化。 Read more
source§

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout)

🔬This is a nightly-only experimental API. (allocator_api #32838)
释放 ptr 引用的内存。 Read more
source§

unsafe fn grow( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)
尝试扩展内存块。 Read more
source§

unsafe fn grow_zeroed( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)
行为类似于 grow,但也确保在返回新内容之前将其设置为零。 Read more
source§

unsafe fn shrink( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)
尝试缩小内存块。 Read more
source§

fn by_ref(&self) -> &Selfwhere Self: Sized,

🔬This is a nightly-only experimental API. (allocator_api #32838)
为这个 Allocator 实例创建一个 “by reference” 适配器。 Read more
source§

impl Clone for System

source§

fn clone(&self) -> System

返回值的副本。 Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

source 执行复制分配。 Read more
source§

impl Debug for System

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

使用给定的格式化程序格式化该值。 Read more
source§

impl Default for System

source§

fn default() -> System

返回类型的 “默认值”。 Read more
source§

impl GlobalAlloc for System

source§

unsafe fn alloc(&self, layout: Layout) -> *mut u8

按照给定的 layout 分配内存。 Read more
source§

unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8

行为类似于 alloc,但也确保在返回之前将内容设置为零。 Read more
source§

unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout)

使用给定的 layout 在给定的 ptr 指针处释放内存块。 Read more
source§

unsafe fn realloc( &self, ptr: *mut u8, layout: Layout, new_size: usize ) -> *mut u8

将内存块缩小或增大到给定的 new_size (以字节为单位)。 该块由给定的 ptr 指针和 layout 描述。 Read more
source§

impl Copy for System

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

获得所有权后的结果类型。
source§

fn to_owned(&self) -> T

从借用的数据创建拥有的数据,通常是通过克隆。 Read more
source§

fn clone_into(&self, target: &mut T)

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

发生转换错误时返回的类型。
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

发生转换错误时返回的类型。
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。