Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions 02-内存.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ RUST也提供了一些其他的裸指针创建关联函数:

`ptr::invalid<T>(addr:usize)->*mut T` 将一个数值作为裸指针,指明这是一个无效的裸指针。
`ptr::invalid_mut<T>(addr:usize)->*mut T` 将一个数值作为可变裸指针,指明这是一个无效的指针。
以上两个函数通常是将指针变量用作他途以提高新能
以上两个函数通常是将指针变量用作他途以提高性能

`ptr::from_raw_parts<T: ?Sized>(data_address: *const (), metadata: <T as Pointee>::Metadata) -> *const T` 从内存地址和元数据创建裸指针

Expand Down Expand Up @@ -577,7 +577,7 @@ assume_init_read是不消费self的情况下获得内部T变量,内部T变量
}
```

#### MaybeUnint<T>典型案列
#### MaybeUninit<T>典型案列
对T类型变量申请内存及赋值:
```rust
use std::mem::MaybeUninit;
Expand Down Expand Up @@ -616,7 +616,7 @@ assume_init_read是不消费self的情况下获得内部T变量,内部T变量
assert_eq!(&data[0], &[42]);
```

下面例子说明一块内存被 `MaybeUnint<T>`封装后,编译器将不再对其做释放,必须在代码中显式释放:
下面例子说明一块内存被 `MaybeUninit<T>`封装后,编译器将不再对其做释放,必须在代码中显式释放:
```rust
use std::mem::MaybeUninit;
use std::ptr;
Expand All @@ -640,7 +640,7 @@ assume_init_read是不消费self的情况下获得内部T变量,内部T变量
`MaybeUninit<T>`是一个非常重要的类型结构,未初始化内存是编程中不可避免要遇到的情况,`MaybeUninit<T>`也就是RUST编程中必须熟练使用的一个类型。

## 裸指针模块再分析
有了`MaybeUnint<T>`做基础后,可以对裸指针其他至关重要的标准库函数做出分析
有了`MaybeUninit<T>`做基础后,可以对裸指针其他至关重要的标准库函数做出分析

`ptr::read<T>(src: *const T) -> T` 此函数在`MaybeUninit<T>`节中已经给出了代码,ptr::read是对所有类型通用的一种复制方法,需要指出,此函数完成浅拷贝,复制后,src指向的变量的所有权会转移至返回值。所以,调用此函数的代码必须保证src指向的变量生命周期结束后不会被编译器自动调用drop,否则可能导致重复drop,出现UB问题。

Expand Down
2 changes: 1 addition & 1 deletion 03-固有函数库及基础类型.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ intrinsic库函数是指由编译器内置实现的函数,一般如下特点
## intrinsic 原子操作函数
原子操作函数主要用于多核CPU,多线程CPU时对数据的原子操作。intrinsic库中atomic_xxx及atomic_xxx_xxx类型的函数即为原子操作函数。原子操作函数主要用于并发编程中做临界保护,并且是其他临界保护机制的基础,如Mutex,RWlock等。
## 数学函数及位操作函数
各种整数及浮点的数学函数实现。这一部分放在intrinsic主要是因为现代CPU对浮点计算由很多支持,这些数学函数由汇编语言来实现更具备效率,那就有必要由编译器来内置实现。
各种整数及浮点的数学函数实现。这一部分放在intrinsic主要是因为现代CPU对浮点计算有很多支持,这些数学函数由汇编语言来实现更具备效率,那就有必要由编译器来内置实现。
## intrinsic 指令优化及调试函数
断言类: assert_xxxx 类型的函数
函数栈:caller_location
Expand Down
2 changes: 1 addition & 1 deletion 05-Iterator.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ pub trait Step: Clone + PartialOrd + Sized {
```
照此,可以实现一个自定义类型的类型, 并支持Step Trait,如此,即可使用Range符号的Iterator。例如,一个二维的点的range,例如Range<(i32, i32)>的变量((0,0)..(10,10)), 三维的点的range,数列等。

一下是为所有整数类型实现Step的宏
以下是为所有整数类型实现Step的宏
```rust

macro_rules! step_identical_methods {
Expand Down
2 changes: 1 addition & 1 deletion 12-std库(一) FFI及内存管理.md
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ OsString及OStr在unix上的结构定义与RUST的String及str基本一致,代
std库与core库在内存管理RUST提供的机制是统一的。即Allocator trait 与 GlobalAlloc trait。
从std库可以发现RUST为什么将内存管理分成了Allocator及GlobalAlloc两个trait。
GlobalAlloc trait是操作系统无关及操作系统相关的界面接口。GlobalAlloc的主要功能就是对操作系统的系统调用进行封装,并完成RUST的内存类型与操作系统的系统调用的类型转换。
Allocator是RUST自身的内存管理模块,其他的RUST模块如果有内存需求,同过Allocator triat来完成。Allocator使用GlobalAlloc完成对操作系统的使用。
Allocator是RUST自身的内存管理模块,其他的RUST模块如果有内存需求,通过Allocator triat来完成。Allocator使用GlobalAlloc完成对操作系统的使用。

std库用System 作为这两个trait的实现载体,core库中用Global重新实现了Allocator,Global没有实现GlobalAlloc,因为Global需要适配非操作系统情况,具体请参考02-内存一章, System的代码如下:

Expand Down