首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 之父親述 STL 誕生記:從委會博弈到泛型程式設計範式確立

     編輯:關於C++

標準化關鍵年:1994-1998

1994 年委會重心在細節、STL、模板分離編譯。1997 年技術投票 43:0 通過,1998 年 ISO 22:0 批准。STL 納入是重大創新,徹底改變容器與演算法設計思維。

STL 前世:Simula/Smalltalk 容器的缺陷

  • 物件必須繼承特定 Link/Object 基類才能入容器 (侵入式)。
  • 內建型別 (int、double) 無法直接存放,需包裝或用陣列 (陣列又不支援用戶型別)。
  • 簡單類別 (complex、Point) 時空效率差。
  • 非靜態型別安全:取出只知為 Object,需轉型。

Bjarne 因缺乏滿意方案,1985 年未提供標準庫 —— 視為重大遺憾。

Alex Stepanov 與泛型程式設計

Alex 在 HP 實驗室 (先前 Bell Labs) 研究十年,基於嚴格數學基礎,追求「最通用且最高效」。1993 年底展示框架,Bjarne 初感困惑:容器用法顯多餘、醜陋。但建立工具清單後發現 STL 除「通用基類提供持久化」外全數滿足。經數週適應後決定力推。

委會攻防與精簡

  • 1993/10 San Jose 會議邀請 Alex 演講,氣氛從「做大事」轉為「先看看」。
  • 1994/3 San Diego 完整說明,10 月 Waterloo 會議納入標準。
  • 原始 STL 過大,Bjarne 逐字刪減約 2/3,Alex 稱「心痛」但造就精簡版 STL。
  • Beman Dawes 實作 10% 後改變「太複雜」看法;委會多為編譯器/庫開發者,非應用開發者,視角偏差。

STL 核心思想:容器、迭代器、演算法三重分離

  • 參數化容器:vector<int>, list<double>。
  • 演算法與容器完全分離:透過迭代器操作元素序列。
  • 迭代器統一介面:* 取值、++ 推進、==/!= 比較。vector 迭代器可退化為指標,list 為節點指標,編譯期靜態綁定,零虛擬函數開銷。
  • 支援內建陣列:find(buf, buf+max, 7) 直接用指標,兼容 C 風格。

函數物件:靈活與高效的關鍵

find_if(v.begin(), v.end(), Less_than<int>(7))。Less_than 保存狀態 (7),operator() 執行比較。優於函式指標:

  • 可攜帶狀態 (如 Accumulator 計算總和與計數)。
  • 傾向按值傳遞,易於 inline,排序時比 qsort 函式指標快。
  • 可構建 Lambda 風格語法 (如 x <= 7)。

STL 影響:確立第四程式設計範式——泛型程式設計

原有三範式:程序式、資料抽象、物件導向。STL 證明模板技術可達成靜態型別安全與高效率,關鍵技術:

  • 迭代器/配置器分離邏輯與物理記憶體存取 (高效能數值計算關鍵)。
  • 小型、簡單、內聯物件 (嵌入式系統優化硬體使用關鍵)。

反擊過度依賴類別階層與虛擬函數的「偽 OO」傾向,提供建設性替代方案。雖不完美 (缺線性代數、嵌入式受限),但開闢新天地,衍生模板元程式設計、Concepts 等後續發展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved