STL之内存处理
說明:本文僅供學習交流,轉載請標明出處,歡迎轉載!
? ? ? ? ? ?STL中與內存配置相關的類是allocator類,頭文件為:#include<alllocator>這是一個模板類,用于內存的分配、對象的構造、對象的析構和空間的刪除。本文主要介紹下相關的函數。
? ? ? ?內存空間的分配:allocate函數
? ? ? ?allocate函數原型為:iter allocate(n,T*)。分配足以容納n個T對象的空間,返回指向所分配空間的首地址。
? ? ? ?對象的構造:construct函數
? ? ? ?construct函數原型為:void construct(T1 *p,const T& value)。用值value去初始化p所指向的地址。
? ? ? ?對象的析構:destroy函數
? ? ? ?destroy函數原型為:void destory(T *p),析構p所指向的對象。
? ? ? ?內存空間的釋放:deallocate函數
? ? ? ?deallocate函數原型為:void deallocate(T *p,size_type n)。將p所指向的n個T類型對象所占用的內存釋放掉。
? ? ? ?以下的幾個函數中。我們用“已知”表示“已經構造”,用“未知”表示“尚未構造”,所謂“未構造”指的是“已分配的空間尚未使用“。
? ? ? ?將已知范圍的元素拷貝到還有一個未知區域:uninitialized_copy函數
? ? ? ?uninitialized_copy函數原型為:iter uninitialzed_copy(b,e,b1),將迭代器范圍[b,e)所指向的元素依次拷貝到[b1,b1+(e-b) )的區域,返回值為iter=b1+(e-b)所指向的空間。
? ? ? ? 將某個值去填充一個未知區域:uninitialized_fill
? ? ? ? uninitialized_fill函數原型為:void unitialized_fill(b,e,t)。用值t去填充迭代器范圍[b,e)所指向的區域。
? ? ? ? 用n個同樣值去填充某個未知區域:uninitialized_fill_n
? ? ? ? uninitialized_fill_n函數原型為:iter uninitialized_fill(b,n,t),用值t去填充迭代器范圍[b,b+n)所指向的區域,返回迭代器 b+n。
? ? ? ? Notice:后三個uninitialized_xxx函數的作用都是用批量初始化一個未知區域(即未使用區域),這三個函數的內部實現中有兩個值得注意的地方:
? ? ? ? 1.嚴格遵守"commit or rollback"原則。該原則規定,在批量初始化過程中。要么產生全部的必要元素。要么不產生一個元素,即要么不做,做了就做好做全。
? ? ? ? 2.在初始化過程中,會先推斷待初始化的元素類型是否為內置類型,若為內置類型POD(Plain Old Data),則直接調用更加底層的函數,上面三個函數相應的底層函數分別為:memmove(b1,b,e-b)、fill(b,e,t)和fill(b,n,x)。若數據類型為其它類型,則循環調用construct(iter,t)函數,這樣做的目的是為了提高效率。
參考文獻:
[1]《C++primer 第4版》
[2]《STL源代碼剖析 侯捷》
轉載于:https://www.cnblogs.com/claireyuancy/p/6700674.html
總結
- 上一篇: jQuery-helloWorld
- 下一篇: Kubernetes 1.6新特性