August 2021
Intermediate to advanced
450 pages
6h 57m
Chinese
大多数情况下,最好避免使用未初始化的内存。这样做可以简化编程,消除很多错误。但是,在极少数情况下,例如当编写内存分配器、实现容器以及直接处理硬件时,直接使用未初始化内存,也称为裸内存(raw memory),是必要的。
除了标准的allocator,<memory>头文件还提供了fill*系列函数用于处理未初始化内存(见32.5.6节)。它们都是使用一个类型名T引用一块足以容纳一个T类型对象的空间而非引用一个正确构造的T类型对象,这很危险,但偶尔又是必需的。这些函数主要是为容器和算法的实现者所用。例如,使用这些函数实现reserve()和resize()是最容易的方法(见13.6节)。
算法常常需要临时空间来获得满意的性能。通常,这种临时空间最好通过一个操作进行分配,但不进行初始化,直至真正需要特定位置时才进行初始化。为此,标准库提供了一对函数分配和释放未初始化空间:
get_temporary_buffer<X>(n)操作尝试为n个或更多类型为X的对象分配空间。如果成功,它返回指向未初始化空间起始地址的指针以及这片空间可以容纳多少个类型为X的对象;否则,pair的second值为0。实现思路是一个系统需要时刻保持足够的空间用于快速分配,使得为n个给定大小的对象分配空间的请求能够得到多于n个的空间。但是,也可能得到更少的空间,因此一种使用get_temporary_buffer()的方法是乐观地请求大量空间,然后使用获得的可用空间。 ...
Read now
Unlock full access