std::make_shared簡化智能指針 `std::shared_ptr` 的創建過程,并提高性能(減少內存分配次數,提高緩存命中率)

std::make_shared 是 C++ 標準庫中的一個函數模板,用于簡化智能指針 std::shared_ptr 的創建過程。引入 std::make_shared 的主要原因是提高代碼的安全性、性能和可讀性。以下是詳細分析:


1. 安全性提升

避免顯式調用 new 導致的錯誤

在不使用 std::make_shared 的情況下,我們通常手動調用 new 來分配內存并初始化對象:

std::shared_ptr<MyClass> ptr(new MyClass(arg1, arg2));

這種方式容易引發以下問題:

  • 異常安全問題:如果在 newstd::shared_ptr 構造之間拋出異常,會導致資源泄漏。
  • 內存管理錯誤:手動調用 new 容易忘記釋放資源。

使用 std::make_shared 后,這些問題都被封裝到函數內部,減少了手動操作的可能性:

auto ptr = std::make_shared<MyClass>(arg1, arg2);

避免顯式分配內存導致的錯誤

std::make_shared 內部會同時完成內存分配和對象構造,確保兩者是一致的。而直接使用 std::shared_ptr(new T) 可能會出現分配內存失敗但對象已經構造完成的情況,從而導致內存泄漏。


2. 性能優化

減少一次內存分配

普通方式創建 std::shared_ptr 時,通常需要兩次內存分配:

  1. 分配一塊內存存儲 std::shared_ptr 的控制塊(包含引用計數等元信息)。
  2. 分配另一塊內存存儲實際的對象。

std::make_shared 將這兩塊內存合并成一次分配,提高了內存分配效率。這尤其在頻繁創建對象時會有顯著的性能提升。

緩存局部性

由于 std::make_shared 將控制塊和對象存儲在一起,訪問控制塊時的緩存命中率更高,從而提升了程序的整體性能。


3. 提高代碼可讀性和簡潔性

使用 std::make_shared 可以使代碼更加簡潔和直觀:

// 普通方式
std::shared_ptr<MyClass> ptr(new MyClass(arg1, arg2));// 使用 make_shared
auto ptr = std::make_shared<MyClass>(arg1, arg2);

后者不僅減少了代碼量,還避免了重復書寫 new,使代碼更易于閱讀和維護。


4. 示例對比

普通方式
std::shared_ptr<int> ptr(new int(42)); // 顯式調用 new
*ptr = 10; // 修改對象
使用 make_shared
auto ptr = std::make_shared<int>(42); // 自動分配和構造
*ptr = 10; // 修改對象

可以看到,std::make_shared 的語法更加簡潔且不易出錯。


5. 總結

std::make_shared 的優點包括:

  • 提高安全性(避免資源泄漏和異常問題)。
  • 提高性能(減少內存分配次數,提高緩存命中率)。
  • 提高代碼可讀性和簡潔性。

因此,在現代 C++ 編程中,推薦優先使用 std::make_shared 來創建 std::shared_ptr


參考資料

  • C++ Reference: std::make_shared
  • Effective Modern C++: Item 14

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

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

相關文章

JDK版本如何絲滑切換

一句話總結 》》》步驟分為&#xff1a; 下載對應JDK配置環境變量 下載JDK 如何下載JDK這里不必多提&#xff0c;提出一點&#xff0c;就是多個版本的JDK最好放在一個文件夾里&#xff08;忽略我的java文件夾&#xff0c;這里都是不同的jdk版本&#xff09;&#xff1a; 配置環…

Rust 通用代碼生成器:蓮花,紅蓮嘗鮮版三十六,啞數據模式圖片初始化功能介紹

Rust 通用代碼生成器&#xff1a;蓮花&#xff0c;紅蓮嘗鮮版三十六&#xff0c;啞數據模式圖片初始化功能介紹 Rust 通用代碼生成器蓮花&#xff0c;紅蓮嘗鮮版三十六。支持全線支持圖片預覽&#xff0c;可以直接輸出帶圖片的啞數據模式快速原型。啞數據模式和枚舉支持圖片。…

45. Jump Game II

目錄 題目描述 貪心 題目描述 45. Jump Game II 貪心 正向查找可到達的最大位置 時間復雜度O(n) class Solution { public:int jump(vector<int>& nums) {int n nums.size();if(n 1)return 0;int cur_cover 0;int cover 0;int res 0;for(int i 0;i < …

model.classifier 通常指模型的分類頭 是什么,詳細舉例說明在什么部位,發揮什么作用

model.classifier 通常指模型的分類頭 是什么,詳細舉例說明在什么部位,發揮什么作用 在深度學習模型中,分類頭(Classifier Head)是指模型末端用于完成分類任務的組件,通常是一個或多個全連接層(線性層)。它的作用是將模型提取的高層語義特征映射到具體的分類標簽空間。…

機器學習+城市規劃第十四期:利用半參數地理加權回歸來實現區域帶寬不同的規劃任務

機器學習城市規劃第十四期&#xff1a;利用半參數地理加權回歸來實現區域帶寬不同的規劃任務 引言 在城市規劃中&#xff0c;如何根據不同地區的地理特征來制定有效的規劃方案是一個關鍵問題。不同區域的需求和規律是不同的&#xff0c;因此我們必須考慮到地理空間的差異性。…

Kivy的ButtonBehavior學習

Kivy的ButtonBehavior學習 ButtonBehavior 簡介1、主要特點2、基本用法3、主要事件4、常用屬性5、方法代碼示例 文檔&#xff1a;https://kivy.org/doc/stable/api-kivy.uix.behaviors.button.html#kivy.uix.behaviors.button.ButtonBehavior ButtonBehavior 簡介 ButtonBeha…

WPS中將在線鏈接轉為圖片

WPS中將在線鏈接轉為圖片 文章目錄 WPS中將在線鏈接轉為圖片一&#xff1a;解決方案1、下載圖片&#xff0c;精確匹配&#xff08;會員功能&#xff09;2、將在線鏈接直接轉為圖片 一&#xff1a;解決方案 1、下載圖片&#xff0c;精確匹配&#xff08;會員功能&#xff09; …

API:解鎖數字化協作的鑰匙及開放實現路徑深度剖析

API:解鎖數字化協作的鑰匙及開放實現路徑深度剖析 一、API 的概念與本質 (一)定義與基本原理 API(Application Programming Interface,應用程序編程接口)是一組定義、協議和工具,用于構建和集成軟件應用程序。它如同一個精心設計的合約,詳細規定了軟件組件之間相互交…

Azure 虛擬機端口資源:專用 IP 和公共 IP Azure Machine Learning 計算實例BUG

## 報錯無解 找不到Azure ML 計算實例關聯的 NSG .env 文件和 ufw status&#xff1a; .env 文件中 EXPOSE_NGINX_PORT8080 是正確的&#xff0c;它告訴 docker-compose.yaml 將 Nginx 暴露在宿主機的 8080 端口。 sudo ufw status 顯示 Status: inactive&#xff0c;意味著宿…

深入理解Python協程:async def、async for、await、yield詳解

前言 在現代編程中&#xff0c;異步編程已成為提高程序效率和性能的重要方式。 Python 作為一種流行的編程語言&#xff0c;自然也提供了強大的異步編程支持。 本文將詳細介紹 Python 中的協程&#xff0c;以及 async def、async for、await 和 yield 等關鍵字的使用。 協程簡介…

基于功能基團的3D分子生成擴散模型 - D3FG 評測

D3FG 是一個在口袋中基于功能團的3D分子生成擴散模型。與通常分子生成模型直接生成分子坐標和原子類型不同&#xff0c;D3FG 將分子分解為兩類組成部分&#xff1a;官能團和連接體&#xff0c;然后使用擴散生成模型學習這些組成部分的類型和幾何分布。 一、背景介紹 D3FG 來源…

寫一個shell腳本,把局域網內,把能ping通的IP和不能ping通的IP分類,并保存到兩個文本文件里

寫一個shell腳本&#xff0c;把局域網內&#xff0c;把能ping通的IP和不能ping通的IP分類&#xff0c;并保存到兩個文本文件里 腳本1 #!/bin/bash #定義變量 ip10.1.1 #循環去ping主機的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…

如何提升企微CRM系統數據的準確性?5大核心策略詳解

在數字化客戶管理時代&#xff0c;企微CRM管理系統已成為企業連接客戶的核心平臺。但據統計&#xff0c;73%的企業因數據質量問題導致客戶分析失真、營銷效果下降。本文將深入解析影響數據準確性的關鍵因素&#xff0c;并提供可落地的優化方案&#xff0c;幫助企業在企微CRM軟件…

Unity輕松實現麥克風錄音與播放

文章目錄 概要錄音&#xff0c;播放音頻注意事項參考 概要 之前有想寫一個音樂播放的器的音頻功能&#xff0c;一直沒做&#xff0c;最近突然想寫&#xff0c;就寫了 錄音&#xff0c;播放 在語言模型中&#xff0c;編碼器和解碼器都是由一個個的 Transformer 組件拼接在一起…

七牛云圖片上傳 前后端全過程

相關網址&#xff1a;七牛開發者中心 相關網站&#xff1a; 七牛開發者中心 上傳流程概述 后端生成上傳憑證&#xff1a;服務器端使用七牛云 SDK 生成上傳憑證&#xff08;uptoken&#xff09;前端獲取憑證&#xff1a;前端通過 API 向后端請求上傳憑證前端上傳圖片&#xff1…

2025年AI生成PPT平臺推薦榜單:五大智能工具革新演示創作體驗

在數字化辦公飛速發展的當下&#xff0c;AI生成PPT平臺已成為職場人士、教育工作者和創意人群提升效率的利器。這些平臺憑借先進的人工智能技術&#xff0c;打破傳統PPT制作的局限&#xff0c;為用戶帶來便捷、高效且充滿創意的制作體驗。經過多維度測評&#xff0c;2025年AI生…

PHP框架在內容管理系統開發中的優勢:效率、安全與擴展性!

在當今快節奏的Web開發環境中&#xff0c;內容管理系統&#xff08;CMS&#xff09;已成為企業和個人建立動態網站的核心工具。傳統的手工編碼開發方式在面對復雜業務邏輯、頻繁迭代和安全要求時往往力不從心。而PHP框架&#xff08;如Laravel、ThinkPHP、Symfony&#xff09;的…

云原生安全實踐:CI/CD流水線集成DAST工具

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 ——從零掌握DevSecOps中的動態安全測試 一、基礎概念 1. DevSecOps DevSecOps 是將安全性&#xff08;Security&#xff09;融入開發&#xff08;Dev&am…

【C語言】基礎知識框架補充

前文主要介紹了C語言從零開始學習的基本框架與基礎知識導覽&#xff0c;本文主要補充此前未提及的學習內容&#xff0c;給有意精進C語言者指明一條可供參考的學習路徑。 補充一&#xff1a;動態內存管理 核心函數&#xff08;需#include <stdlib.h>&#xff09;&#xf…

垃圾識別檢測與分類數據集(貓臉碼客第244期)

目標檢測與垃圾&#xff1a;技術革新與環境管理的交匯點 在當今社會&#xff0c;城市化進程不斷加速&#xff0c;人口持續增長&#xff0c;垃圾處理問題愈發凸顯其重要性。有效管理垃圾&#xff0c;不僅關乎環境衛生狀況&#xff0c;更直接影響到城市的可持續發展以及居民的生…