日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL之内存处理

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的STL之内存处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。