C++知識

文章目錄

    • 1.C++map為什么線程不安全?
    • 2.map大量插入會有性能問題,為什么
    • 3.set的應用場景
    • 4.map set mutiset mutimap unordered_map unordered_set的底層實現、使用場景、優缺點

1.C++map為什么線程不安全?

其實STL中的容器都是線程不安全的,如果想要線程安全的話,就得自己加鎖。

C++ 標準庫從 C++11 開始明確規定:多個線程并發地對同一個 std::map 對象進行讀寫操作,是未定義行為(UB)——除非你自己加鎖(如 std::mutex)。

為什么 std::map 不自帶鎖?

  1. 性能優先
    標準庫容器的設計哲學是零開銷抽象(zero-overhead abstraction)。
    如果每個操作都加鎖,即使單線程程序也會被迫承擔鎖的開銷,這違背了 C++ 的設計原則。
  2. 靈活性更高
    用戶可以根據具體場景選擇鎖的粒度(全局鎖、分段鎖、讀寫鎖等)。
    標準庫提供了 std::mutex、std::shared_mutex 等工具,讓用戶自己組合。

2.map大量插入會有性能問題,為什么

std::map 在“大量插入”場景下出現性能瓶頸,并不是因為它“不會用 CPU”,而是由它的底層數據結構(紅黑樹)和接口語義共同決定的。下面把原因拆成 4 個層面,一層層展開:
① 數據結構層面:紅黑樹的 O(log n) 代價
插入 = 搜索插入點 + 樹重平衡。

每 insert/operator[] 都要從根節點一路比較到葉子,找到插入位置;隨后可能觸發 旋轉 + 顏色翻轉,這些都是 O(log n) 的 CPU 計算。

當 n 達到百萬、千萬級時,log?(n) 依舊不算小,而且每一次操作都獨立走一遍完整路徑,CPU 分支預測失敗率高、cache miss 高。

② 內存分配層面:節點級分配帶來的負擔

紅黑樹是 “節點式容器”(node-based container),每插入一個元素就至少一次 new/malloc。

大量小對象分配 →內存碎片;分配器鎖競爭(默認 glibc ptmalloc 的 global arena 鎖);cache locality 極差:節點散落在堆各處,遍歷時隨機訪問,TLB & cache 命中率低。

③ 接口語義層面:每次插入都要“唯一鍵”檢查

std::map::insert 和 operator[] 都要 先查重,保證鍵唯一。就算你事先知道鍵不會重復,也繞不開這次查找;而哈希表(unordered_map)可以通過 reserve + emplace_hint 避免重復檢查。

④ 并發層面:自帶無鎖機制 → 線程競爭放大問題

如果你在多線程環境用全局 mutex 保護 std::map,鎖粒度是整個對象;大量插入讓這把鎖成為 熱點,線程上下文切換/睡眠開銷迅速放大(之前談過的互斥鎖 vs 自旋鎖問題)。

綜合癥狀 = 計算 + 內存 + 并發 三重放大

維度開銷來源量級
CPU紅黑樹 log n 比較 + 旋轉10? 次插入時 log?(10?) ≈ 23
內存每元素一次 new + 指針開銷額外 2~3 倍內存放大
并發全局 mutex 或分配器鎖線程越多越慢

std::map 大量插入慢,是因為 “紅黑樹的節點級操作 + 每次 log n 計算 + 頻繁內存分配” 三者疊加;把容器換成哈希表、把一次性插入變成批量構造,或者把 map 拆掉分片,都能讓性能上一個數量級。

3.set的應用場景

需求容器
需要去重、有序遍歷、范圍查詢是否存在std::set / std::multiset
只去重/查詢、不關心順序std::unordered_set(平均 O(1))
鍵可重復std::multisetunordered_multiset
極高并發讀寫第三方并發 set(tbb::concurrent_hash_set, folly::F14)

4.map set mutiset mutimap unordered_map unordered_set的底層實現、使用場景、優缺點

容器底層實現典型場景優點缺點
map紅黑樹鍵值對有序、范圍查詢、遍歷有序、可范圍遍歷、最壞O(log n)內存碎片大、插入慢、cache差
set紅黑樹去重+有序遍歷、排行榜有序、唯一鍵、支持lower_bound同map缺點
multiset紅黑樹允許重復鍵的有序集合保留排序、可存重復同map缺點
multimap紅黑樹一鍵多值的有序存儲一鍵多值、范圍遍歷同map缺點
unordered_map哈希表鍵值對無序、高速增刪查平均O(1)、內存連續性好無序、rehash開銷、最壞O(n)
unordered_set哈希表高速去重、存在性檢查平均O(1)、簡單高效無序、rehash開銷、最壞O(n)

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

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

相關文章

自學嵌入式第三十四天:網絡編程-TCP

一、UDP用戶數據報收發次數要對應;數據與數據之間有邊界,多次調用收發時都是不同的數據報;接收方的數據大小>發送方的數據大小,如果接受方數據小了則會丟棄未讀的部分,再次調用只會讀下一包數據;二、服務…

Apache IoTDB:國產時序數據庫的崛起與工業物聯網的未來

📑前言 在工業物聯網的浪潮中,數據不再是副產品,而是驅動決策的核心資產。"隨著物聯網、工業互聯網和智能監控的迅猛發展,時序數據正以前所未有的速度爆發。據預測,到2025年全球物聯網設備將達750億臺&#xff0c…

一鍵核驗,安全無憂!手機號三要素詳情版API,為您的業務筑牢身份認證防線

一、什么是手機號三要素核驗API? 手機號三要素核驗API 是一種通過編程接口,實時驗證一條個人身份信息是否與該國運營商登記的實名信息一致的在線服務。 這里的“三要素”特指: 姓名 身份證號碼 手機號碼 核驗過程:用戶提交上述三個…

輕松上手 qData 數據中臺開源版:Docker Compose 助你10分鐘跑起來

說在前面 誰適合看這份指南? 初次接觸 qData,希望快速體驗功能的小伙伴不想折騰復雜環境配置和前端打包的人想用“一鍵啟動”省事體驗完整平臺的用戶 我們已經為你準備好“開箱即用”的完整部署包,包括: ? 前端靜態資源&…

Qt讀寫Excel--QXlsx基本使用

1、概述 Document 類是一個用于操作 XLSX 文件的類,繼承自 QObject。它提供了對 Excel 文件的讀寫操作,包括單元格的讀寫、圖片和圖表的插入、單元格合并、列和行的格式化、數據驗證和條件格式化等功能。此外,它還支持對工作簿和工作表的操作…

P13929 [藍橋杯 2022 省 Java B] 山 題解

縮減一下題目的意思,問區間 [2022,2022222022] 有多少個數是回文數并且先單調不減,后單調不增。 因為有這兩條條件,我們可以得知在判斷時只用判斷前半段的每個數是不是和對面相應的位置相等,以及是否單調不減。 為什么不用看后半段…

Unity Android 文件的讀寫

配置AndroidManifest 文件在Assets 目錄下查找AndroidManifest 文件&#xff0c;添加權限聲明&#xff0c;在application 節點中添加requestLegacyExternalStorage 屬性。<!-- 權限聲明 --> <uses-permission android:name"android.permission.READ_EXTERNAL_STO…

Pydantic模型驗證測試:你的API數據真的安全嗎?

url: /posts/03b2afdf35f55dbaef631710ab6da82c/ title: Pydantic模型驗證測試:你的API數據真的安全嗎? date: 2025-09-03T23:46:18+08:00 lastmod: 2025-09-03T23:46:18+08:00 author: cmdragon summary: Pydantic在FastAPI中用于數據驗證和序列化,通過Python類型注解自動…

【Proteus仿真】AT89C51單片機中斷系列仿真——INT0中斷控制LED小燈/INT0和INT1中斷控制數碼管

目錄 0案例視頻效果展示 0.1例子1&#xff1a;INT0控制LED閃爍 0.2例子2&#xff1a;INT0中斷控制數碼管計數 0.3例子3&#xff1a;INT0中斷實現秒表功能 0.4例子4&#xff1a;INT0INT1中斷控制數碼管計數 1基礎知識補充——中斷系統 1.1 中斷源一覽 1.2 控制寄存器 1…

MTK Linux DRM分析(三十三)- MTK mtk_mipi_tx.c

一、MIPI PHY驅動簡介 1. MIPI 協議分層 應用層:顯示(DSI)、攝像頭(CSI)。 協議層:定義像素/圖像幀如何封裝成數據包。 物理層(PHY):具體電氣信號傳輸方式 —— 這里就是 D-PHY 或 C-PHY。 2. D-PHY(Differential PHY) 傳輸方式:差分信號(類似 LVDS/USB/PCIe …

G2D 圖形加速器

文章目錄G2D 圖形加速器1. 功能簡介1.1 矩形填充1.2 旋轉和鏡像 (rotate and mirror)1.3 透明度混合1.4 colorkey1.5 縮放 (Stretchblt)2. G2D 框架3. 全志 G2D 使用示例3.1 使用G2D實現圖像旋轉縮放3.2 實時預覽中加入旋轉縮放功能G2D 圖形加速器 G2D模塊主要實現圖像旋轉、數…

【FPGA】單總線——DS18B20

目錄 項目&#xff1a;項目&#xff08;含quartus工程、仿真文件&#xff09; 1. 單總線通信時序詳解 1.1 初始化&#xff08;復位脈沖 存在脈沖&#xff09; 1.2 寫時隙&#xff08;寫“0”和寫“1”&#xff09; 1.3 讀時隙 2. DS18B20 暫存器與溫度數據格式 2.1 暫存…

JUC的安全并發包機制

目錄 1. Lock機制&#xff1a;明鎖控制 2. 柵欄機制(CyclicBarrier) 3. 閉鎖機制(CountDownLatch) 4. 信號量機制(Semaphore) 5. 無鎖機制 1. Lock機制&#xff1a;明鎖控制 Lock接口提供了比synchronized更靈活的鎖機制&#xff0c;屬于明鎖&#xff08;需要手動獲取和釋…

開源企業級快速開發平臺(JeecgBoot)

JeecgBoot 是一款基于 Spring Boot Vue 技術棧的開源企業級快速開發平臺&#xff0c;旨在通過「低代碼代碼生成」模式降低企業級應用的開發成本&#xff0c;提升開發效率。其核心定位是“開箱即用的中后臺解決方案”&#xff0c;覆蓋權限管理、表單報表、工作流、代碼生成等核…

探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處,找到滿足您項目需求的最佳數據庫解決方案。

探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處&#xff0c;找到滿足您項目需求的最佳數據庫解決方案。 探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處&#xff0c;找到滿足您項目需求的最佳數據庫解決方案。 關系數據庫已經存在了很長時間。事實上&#xff0c;關系…

如何畫時序圖、流程圖、狀態流轉圖

如何畫時序圖、流程圖、狀態流轉圖流程圖符號約定時序圖元素交互框最佳實踐狀態流轉圖在研發或者寫技術方案的時候&#xff0c;我們經常會畫各種圖。圖比文字更加容易理解一些&#xff0c;那么如何畫出優秀好看的圖呢下面簡單介紹一些畫圖時需要注意的點 流程圖 流程圖是流程…

CSDN 與 掘金 高效學習指南

CSDN 和掘金&#xff08;juejin.cn&#xff09;是國內最活躍的技術社區&#xff0c;但信息量巨大、質量參差不齊。高效運用的關鍵是&#xff1a;從“被動瀏覽”轉向“主動獲取”&#xff0c;避免陷入“收藏一堆文章卻學不會”的陷阱。 以下是為你量身定制的CSDN 與 掘金 高效學…

容器tomcat鏡像制作

pull-tomcat鏡像 docker pull tomcat啟動 –security-opt 禁用默認的安全策略&#xff0c;放寬限制 docker run -d --name mysql-tomcat -p 8080:8080 --security-opt seccompunconfined tomcat:latest進入容器直接訪問404&#xff0c;網頁相關的webapps下面為空&#xff0c;將…

AC安全認證方式全解析

AC的幾種安全認證方法認證方式 安全性 便捷性 典型應用場景 所需配置Portal認證 ??中 高 訪客網絡、商場、 Portal服務 酒…

《壘球江西百科》男子壘球世界紀錄·壘球9號位

男子壘球世界紀錄終極盤點? | 冷知識科普&#xff01;1. 最遠本壘打距離 | Longest Home Run Distance紀錄保持者&#xff1a; Jeff Hall (美國)距離&#xff1a; 643英尺 (約196米)賽事&#xff1a; 2012年 USSSA 慢投壘球錦標賽? 科普&#xff1a; 慢投壘球中&#xff0c;球…