Module std::alloc

1.28.0 · source ·
Expand description

内存分配 API。

在给定程序中,标准库具有一个 global 内存分配器,例如 Box<T>Vec<T> 就会使用它。

当前未指定默认的分配器。 但是,默认情况下,保证像 cdylib 和 staticlib 这样的库都使用 System

#[global_allocator] 属性

此属性允许配置分配器的选择。 您可以使用它来实现一个完全自定义的 alloc 分配器,以将所有默认分配请求路由到自定义对象。

use std::alloc::{GlobalAlloc, System, Layout};

struct MyAllocator;

unsafe impl GlobalAlloc for MyAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        System.alloc(layout)
    }

    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
        System.dealloc(ptr, layout)
    }
}

#[global_allocator]
static GLOBAL: MyAllocator = MyAllocator;

fn main() {
    // 该 `Vec` 将通过上面的 `GLOBAL` 分配内存
    let mut v = Vec::new();
    v.push(1);
}
Run

该属性用于其类型实现 GlobalAlloc trait 的 static 项。 可以由外部库提供此类型:

use jemallocator::Jemalloc;

#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;

fn main() {}
Run

#[global_allocator] 只能在 crate 或其递归依赖性中使用一次。

Structs

  • AllocErrorExperimental
    AllocError 错误表示分配失败,这可能是由于资源耗尽或将给定输入参数与此分配器组合在一起时出错所致。
  • GlobalExperimental
    全局内存分配器。
  • 一块内存的布局。
  • Layout::from_size_align 或其他 Layout 构造函数的参数不满足其记录的约束。
  • 操作系统提供的默认内存分配器。

Traits

  • AllocatorExperimental
    Allocator 的实现可以分配,增长,收缩和释放通过 Layout 描述的任意数据块。
  • 可以通过 #[global_allocator] 属性将其分配为标准库的默认内存分配器。

Functions

  • 注册一个自定义分配错误钩子,替换以前注册的任何错误。
  • 注销当前分配的错误钩子,并返回它。
  • 使用全局分配器分配内存。
  • 使用全局分配器分配零初始化内存。
  • 使用全局分配器释放内存。
  • 由于内存分配错误或失败而中止。
  • 使用全局分配器重新分配内存。

Type Definitions