【C/C++】STL實現版本為什么比手寫版本高?

文章目錄

  • 為什么標準庫版本效率更高?
    • 1 具體介紹
      • 1.1 **內聯優化(Inlining)和模板展開**
      • 1.2 **分支預測友好(Branch Prediction)**
      • 1.3 **迭代器解耦 + 靜態分發**
      • 1.4 **代碼緊湊,編譯器優化空間大**
      • 1.5 **高質量手工優化的底層實現**
    • 2 是不是永遠都不用手寫版本?
    • 3 實際對比示例(基準測試)
    • 4 總結

為什么標準庫版本效率更高?

C++ 標準庫中的 lower_bound / upper_bound 為例, STL版本幾乎總是比手寫的版本運行得更快,即便邏輯是一樣的。這種性能差距主要來自于 編譯器優化、庫實現細節和泛型設計


1 具體介紹

1.1 內聯優化(Inlining)和模板展開

  • 標準庫函數是模板函數,通常被內聯展開(inline),避免了函數調用開銷。
  • 編譯器知道 STL 函數的模式和行為,能做更 aggressive 的優化。

手寫版本往往無法做到等效的內聯效果,尤其是你寫在 main() 外部或者分文件時。


1.2 分支預測友好(Branch Prediction)

  • STL 實現通常設計得非常簡潔,控制流固定,對 CPU 的分支預測非常友好。
  • 手寫代碼可能含有更多不必要的條件判斷,使得 CPU 預測失誤,影響流水線效率。

1.3 迭代器解耦 + 靜態分發

  • 標準庫使用泛型迭代器(例如 RandomAccessIterator),可以在編譯期決定是否使用加法或 std::advance,提高泛用性和效率。
  • 對于 vector,STL 使用的是原始指針(內置類型),訪問元素極快。

1.4 代碼緊湊,編譯器優化空間大

  • STL 實現是高度壓縮、無冗余的模板代碼,結構良好。

  • 編譯器更容易分析和優化,比如:

    • 循環展開
    • SIMD(向量化)
    • 常量傳播

1.5 高質量手工優化的底層實現

  • STL 是由庫專家手寫并經過多年優化的。比如 libstdc++, libc++ 都對這些函數進行了低級別手工優化。
  • 它們處理了你寫代碼時容易忽略的邊界和性能細節。

2 是不是永遠都不用手寫版本?

不一定:

使用 STL手寫實現
適合幾乎所有實用場景適合特別調試、教育用途或嵌入特殊邏輯
易讀、穩定、最優性能可加入自定義行為,比如“自定義比較器”、“更復雜的數據結構”

3 實際對比示例(基準測試)

#include <algorithm>
#include <chrono>
#include <vector>int manual_lower_bound(const std::vector<int>& v, int value) {int left = 0, right = v.size();while (left < right) {int mid = (left + right) / 2;if (v[mid] < value)left = mid + 1;elseright = mid;}return left;
}

【網上搜集資料顯示】在多次測試中,std::lower_bound 常比手寫版快 5% ~ 30%,特別是在大數據量(如 1e6+)時差距明顯。


4 總結

原因說明
編譯器能充分優化 STL模板 + 內聯 + 無分支陷阱
實現精簡控制流干凈,CPU 分支預測更精準
針對常用容器做了專門優化vector, array, pointer 等幾乎零開銷
可讀性和可靠性極強無需重復造輪子,避免 bug

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86225.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

35.成功解決編寫關于“江協科技”編寫技巧第二期標志位積累的問題

江科大學長又發布了第二期的編寫技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面給了一個未完成的任務&#xff1a; 這里我已經把這個問題給解決了&#xff01; 總代碼放在資源里面&#xff0c;key.c放在文章最后面&#xff01;同時感…

STM32什么是寄存器

提示&#xff1a;文章 文章目錄 前言一、背景二、2.12.2 三、3.1 總結 前言 前期疑問&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空間中&#xff0c;512MB的block2上&#xff0c;每4個字節組成32位&#xff0c;這個32位為一個單元&#xff0c;控制&a…

【Pinia】Pinia和Vuex對比

Pinia 是 Vue 官方團隊成員專門開發的一個全新狀態管理庫&#xff0c;并且 Vue 的官方狀態管理庫已經更改為了 Pinia。 在 Vuex 官方倉庫中也介紹說可以把 Pinia 當成是不同名稱的 Vuex 5&#xff0c;這也意味不會再出 5 版本了。 優點 1. 更加輕量級&#xff0c;壓縮后提交只…

通過 Ansible 在 Windows 2022 上安裝 IIS Web 服務器

拓撲結構 這是一個用于通過 Ansible 部署 IIS Web 服務器的實驗室拓撲。 前提條件&#xff1a; 在被管理的節點上安裝WinRm 準備一張自簽名的證書 開放防火墻入站tcp 5985 5986端口 準備自簽名證書 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle雙平面適用場景討論會議

4月28日&#xff0c;我在杭州組織召開了Oracle雙平面會議討論沙龍。在國產化數據庫浪潮的今天&#xff0c;Oracle數據庫作為國產數據庫的應急庫&#xff0c;在國產數據庫發生故障或者性能下降時&#xff0c;如何更好的使用Oracle。會議主題如下&#xff1a; 1、背景與痛點速覽&…

10.Linux進程信號

1. 理解信號 信號VS信號量 老婆&#xff1a;老婆餅-》沒有任何關系&#xff01;信號&#xff1a;鬧鐘&#xff0c;上課鈴聲&#xff0c;臉色...人-》進程&#xff1b;信號中斷人正在做的事&#xff0c;是一種事件的異步通知機制&#xff1b; 我們自習一會&#xff0c;等張三回…

求解插值多項式及其余項表達式

例 求滿足 P ( x j ) f ( x j ) P(x_j) f(x_j) P(xj?)f(xj?) ( j 0 , 1 , 2 j0,1,2 j0,1,2) 及 P ′ ( x 1 ) f ′ ( x 1 ) P(x_1) f(x_1) P′(x1?)f′(x1?) 的插值多項式及其余項表達式。 解&#xff1a; 由給定條件&#xff0c;可確定次數不超過3的插值多項式。…

C++刷題:日期模擬(1)

&#xff08;注&#xff1a;本文所展示代碼均為本人所寫&#xff0c;不一定為最優&#xff09; 我們首先用純邏輯和手動計算來拆解日期模擬題&#xff0c;再來代碼實現&#xff0c;看看這些問題的底層思路怎么玩明白&#xff5e; 一、基礎日期計算&#xff1a;直接算“過幾天是…

深入剖析Nginx:從入門到高并發架構實戰

深入剖析Nginx&#xff1a;從入門到高并發架構實戰 摘要&#xff1a;本文全面解析Nginx的核心功能、架構原理及實戰配置&#xff0c;涵蓋負載均衡、反向代理、動靜分離等高級應用場景&#xff0c;助你構建高性能Web服務架構。 一、Nginx是什么&#xff1f;為什么它如此重要&…

Qt客戶端技巧 -- 窗口美化 -- 圓角窗口

不解析&#xff0c;直接給代碼例子 利用窗口重繪事件處理函數paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…

Three.js學習筆記-三要素

Three.js 學習筆記-三要素 一、Three.js 簡介 (一)前世今生 Three.js 是一款運行在瀏覽器中的 3D 引擎,由 Ricardo Cabello(Mr.doob)在 2010 年 4 月于 GitHub 首次發布 。其起源可追溯到本世紀初,代碼最初用 ActionScript 編寫,2009 年移植到 JavaScript。隨著 Web…

動力電池點焊機:驅動電池焊接高效與可靠的核心力量|比斯特自動化

在新能源汽車與儲能設備需求激增的背景下&#xff0c;動力電池的制造工藝直接影響產品性能與安全性。作為電芯與極耳連接的核心設備&#xff0c;點焊機如何平衡效率、精度與可靠性&#xff0c;成為電池企業關注的重點。 動力電池點焊機的核心功能是確保電芯與極耳的穩固連接。…

OpenCV CUDA模塊圖像處理------創建一個模板匹配(Template Matching)對象函數createTemplateMatching()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 創建一個用于在 GPU 上執行模板匹配的 TemplateMatching 對象。 該函數返回一個指向 TemplateMatching 的智能指針&#xff08;Ptr&#xff09;…

natapp 內網穿透失敗

連不上網絡錯誤調試排查詳解 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 如何將DNS服務器修改為114.114.114.114_百度知道 連不上/錯誤信息等問題解決匯總 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 nslookup auth.natapp.cnping auth.natapp.cn

游戲(game)

題目描述 小明最近迷上了一款游戲&#xff0c;并且很想成為這款游戲的高手&#xff0c;這款游戲需要用 資源來買裝備。他剛開始的資源價值為0,于是他每天都會做日常任務來獲得價值為1的資源。 這款游戲中有每日商店&#xff0c;小明已經提前知道了接下來n天會出現的裝備&#x…

C# 類和繼承(抽象類)

抽象類 抽象類是指設計為被繼承的類。抽象類只能被用作其他類的基類。 不能創建抽象類的實例。抽象類使用abstract修飾符聲明。 抽象類可以包含抽象成員或普通的非抽象成員。抽象類的成員可以是抽象成員和普通帶 實現的成員的任意組合。抽象類自己可以派生自另一個抽象類。例…

關于臟讀,幻讀,可重復讀的學習

mysql 可以查詢當前事務隔離級別 默認是RR repeatable-read 如果要測臟讀 要配成未提交讀 RU 讀到了未提交的數據。 3.演示不可重復讀 要改成提交讀 RC 這個是指事務還未結束&#xff0c;其他事務修改了值。導致我兩次讀的不一樣。 4.RR–可以解決不可重復讀 小總結&…

華為云Astro中服務編排、自定義模型,頁面表格之間有什么關系?如何連接起來?如何操作?

目錄 一、核心關系解析 二、連接方式與操作步驟 (一)服務編排與自定義模型的連接 (二)自定義模型與頁面表格的連接 (三)服務編排與頁面表格的連接 三、操作示例:構建數據處理閉環 場景:用戶在頁面表格中修改設備信息,觸發服務編排校驗數據并更新數據庫。 四、…

Docker鏡像無法拉取問題解決辦法

最近再學習RabbitMQ&#xff0c;需要從Docker鏡像中拉取rabbitMQ&#xff0c;但是下拉失敗 總的來說就是無法和docker鏡像遠程倉庫建立連接 我又去嘗試ping docker.io發現根本沒有反應&#xff0c;還是無法連接找了許多辦法還是沒有辦法解決&#xff0c;最后才發現是鏡像問題&a…

向 AI Search 邁進,騰訊云 ES 自研 v-pack 向量增強插件揭秘

作者&#xff1a;來自騰訊云劉忠奇 2025 年 1 月&#xff0c;騰訊云 ES 團隊上線了 Elasticsearch 8.16.1 AI 搜索增強版&#xff0c;此發布版本重點提升了向量搜索、混合搜索的能力&#xff0c;為 RAG 類的 AI Search 場景保駕護航。除了緊跟 ES 官方在向量搜索上的大幅優化動…