STL源碼剖析之allocator(1)

来源:https://www.cnblogs.com/dreamnwx1/archive/2018/01/29/8379418.html
-Advertisement-
Play Games

空間配置器(allocator)這個概念在閱讀源碼之前我根本沒有聽過,原以為記憶體分配都是使用new和delete運算符(註意和operator new、placement new、operator delete以及placement delete不同)。在實際使用STL編程時也很少會遇到自己去實現一 ...


空間配置器(allocator)這個概念在閱讀源碼之前我根本沒有聽過,原以為記憶體分配都是使用new和delete運算符(註意和operator new、placement new、operator delete以及placement delete不同)。在實際使用STL編程時也很少會遇到自己去實現一個空間配置器的情況。事實上,STL容器背後都要依靠空間配置器去分配空間。在閱讀容器等STL組件的實現之前如果不瞭解空間配置器的原理,就會造成閱讀上的困難。在侯捷的《STL源碼剖析》一書中說道:為什麼不說allocator是記憶體配置器而說它是空間配置器呢?因為空間不一定是記憶體,空間也可以是磁碟或其他輔助介質。但是目前我還沒遇到過除記憶體外的資源配置情況,下文介紹SGI STL中的源碼也都是對記憶體的配置。

根據STL的規範,allocator必須實現以下介面:

allocator::value_type  
allocator::pointer
allocator::const_pointer
allocator::reference
allocator::const_reference
allocator::size_type
allocator::difference_type

定義了用於iterator traits的相關型別,具體到iterator traits技術再介紹。

allocator::rebind

 一個類模板,內部聲明瞭類型other,代表allocator<U>。如果有了allocator<T>,想要allocator<U>和allocator<T>有相同分配策略,那麼allocator<U>等同於allocator<T>::rebind<U>::other。

allocator::allocator()
allocator::allocator(const allocator&)
template<class U> allocator::allocator(const allocator<U>&)
allocator::~allocator()

 alllocator的預設構造函數、複製構造函數、帶模板的複製構造函數,以及析構函數。

pointer allocator::address(reference x) const    //等同於&x
pointer allocator::address(const_reference x) const    //等同於&x

返回對象地址,區別在於傳入參數是否是const

void allocator::allocate(size_type n, const void* = 0)

分配空間但不初始化

void allocator::deallocate(pointer p, size_type n)

回收空間

void allocator::max_size() const

返回可成功配置的最大量

void allocator::construct(pointer p, const T& x)

等同於 new ((void *) p) T(x)

void allocator::destroy(pointer p)

等同於 p->~T()

SGI實際使用的配置器為alloc而不是allocator,且不接受任何參數。如果要在程式中使用SGI提供的配置器不能寫成類似於

vector<int, std::allocator<int> > iv

而是

vector<int, std::alloc> iv;

說明:在Visual Studio 2017中上面的定義沒有什麼問題,gcc/g++沒有測試過不知道可不可以。第二個vc++肯定不行,g++未知。

SGI STL為每個容器都指定了預設的空間配置器為alloc,如下麵vector的聲明:

template<class T, class Alloc = alloc>
class vector { ... };

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為項目需求,需要車輛品牌信息和車系信息,昨天用一天時間研究了jsoup爬取網站信息。項目是用maven+spring+springmvc+mybatis寫的。 jsoup開髮指南地址:http://www.open-open.com/jsoup/ 這個是需要爬取網站的地址 https://car. ...
  • Github: "https://github.com/nnngu" 項目源代碼: "https://github.com/nnngu/nguSeckill" 前端交互流程設計 對於一個系統,需要產品經理、前端工程師和後端工程師的參與,產品經理將用戶的需求做成一個開發文檔交給前端工程師和後端工程師, ...
  • 在面向對象編程的過程中,我們很容易通過繼承、多態來解決縱向擴展。 但是對於橫向的功能。面向對象的是無法解決的。所以AOP——面向切麵編程其實是面向對象編程思想的一個補充。過濾器和攔截器是AOP思想的具體實現,本文講解了在Spring boot下對過濾器和攔截器的使用。 ...
  • 工程報錯:java.lang.NoClassDefFoundError 名稱:類文件衝突 原因: 問題1,Windows 系統在某些時候不區分大小寫,比如Windows會認為Test.class 和test.class 是一個文件,無法區分。 問題2,在項目工程中有多個源碼包(source fold ...
  • 作為一個前端專業的人來說,對於事務的理解,一直停留在“要麼都成功,要麼都不成功”的小白階段。既然自己將2018年定義為”深入理解“的一年,那麼就從深入理解事務開始吧。 ...
  • dubbo消費者調用服務超時的原因可能有很多,今天排查問題花了兩個小時,也查了很多資料,好像每一篇資料都是提出一個問題,所以簡單總結幾點: 1. 配置才是重中之重,仔細檢查服務提供方的dubbo service和消費者的dubbo reference。保證服務方暴露介面和ref對象正確,保證消費者引 ...
  • 圖形用戶界面( G raphical U ser I nterface,GUI)編程 Python2.0級以下的版本叫做Tkinter,Python3.0改名為tkinter tkinter 模塊:添加 Tk 到應用中 那麼為了讓 tkinter 成為應用的一部分,你需要做些什麼呢?首先,已經存在的 ...
  • 一、int轉換成string Ⅰ、to_string函數 c++11標準增加了全局函數std::to_string: string to_string (int val); string to_string (long val); string to_string (long long val); ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...