1. 程式人生 > >[C++] 空間配置器——allocator類

[C++] 空間配置器——allocator類

 

1、new和delete有一些靈活性上的侷限:new把記憶體分配和物件構造組合在了一起;delete將物件析構和記憶體釋放組合在了一起。   2、當分配一大塊記憶體時,我們通常計劃在這塊記憶體上按需構造物件,在此情況下,我們希望 將記憶體分配和物件構造分離;這意味著我們可以分配大塊記憶體,但只在真正需要的時候才真正執行物件建立操作。   3、allocator類,定義在 標頭檔案memory中,它幫助我們將記憶體分配和物件構造分離開來,它提供一種 型別感知的記憶體分配方法,它分配的記憶體是 原始的、未構造的。在分配記憶體時,它會根據物件型別來確定恰當的 記憶體大小
對齊位置。   4、allocator類中的演算法
#ifndef _ALLOCATOR_H_
#define _ALLOCATOR_H_

#include<memory>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
class Allocator { //這個是自己命名的類
public:
    /**
    * 記憶體分配練習
    * allocate(n),分配大小為n未初始化空間;
    * construct(q),對q指向的空間進行預設初始化;construct(q,"j"),對q指向的空間初始化為"j",只要是合法的初始化器就可以;
    * destroy(q),對q指向的物件進行析構
    * deallocate(p,n),釋放原始分配的空間,必須先把記憶體中的物件全部析構,然後全部釋放,不能只釋放一部分
    
*/ void allocator_test(const int &n) { allocator<string>alloc; auto p = alloc.allocate(n);//分配儲存n個string的原始記憶體 auto q = p; while (q != p + n) { alloc.construct(q++, "zhizhiyu");//構造n個string } cout << "構造的第一個string是:"<<*(p) << endl;
while (q != p) { alloc.destroy(--q);//對分配的物件進行析構 } alloc.deallocate(p, n);//釋放記憶體 } /** * 拷貝和填充原始記憶體,allocate,deallocate, * uninitialized_copy(b,e,b2),向原始空間b2中拷貝由b和e指定範圍的元素,返回遞增之後的目的位置暫存器,指向下一個未構造的位置 * uninitialized_copy_n(b,n,b2),向原始空間b2中拷貝由b開始的n個元素,返回遞增之後的目的位置暫存器,指向下一個未構造的位置 * uninitialized_fill(b,e,t),b和e範圍指定的原始記憶體用元素t填充,無返回值 * uninitialize_fill_n(b,n,t),b開始的n個原始記憶體空間用元素t填充,無返回值 */ void alloc_copy_and_fill(const vector<int>&v) { int n = v.size(); allocator<int> alloc; auto p = alloc.allocate(n * 4); auto q = uninitialized_copy(v.begin(), v.end(), p);//拷貝v到未初始化空間中 q = uninitialized_copy_n(v.begin(), n, q);//再把v拷貝一遍 uninitialized_fill(q, q + n, 22);//用22填上接下來n個空間 uninitialized_fill_n(q+n, n, 44);//剩餘n個空間變為44 auto pq = q + 2*n; while (pq != p) { cout << *(--pq) << " "; alloc.destroy(pq); } alloc.deallocate(p, n * 4); } }; #endif