C++內存布局、構造函數規則和優化策略解析

一、類對象內存布局深度解析

1.1 核心內存占用規則
  • ?非靜態成員變量?:每個對象獨立存儲,按聲明順序排列(含內存對齊填充)
    示例:class A{int x; char y;}; → 實際占用8字節(4+1+3填充)4
  • ?靜態成員?:不占用對象空間,存儲于全局數據區(.data.bss段)4,5
  • ?成員函數?:存儲于代碼段(text),通過隱式this指針訪問對象數據3,5
  • ?虛函數?:引入虛表指針(vptr,64位占8字節),指向類的虛函數表(所有對象共享)1,2
1.2 內存對齊關鍵機制

編譯器自動填充以保證硬件訪問效率:

class Example {char a;      // 偏移0 (1字節)// 填充3字節int b;       // 偏移4 (4字節對齊)double c;    // 偏移8 (8字節對齊)
};               // 總大小:16字節

對齊規則:結構體大小 = 最大成員對齊值的整數倍6,7

1.3 繼承體系的內存演化
繼承類型內存布局特點示例大小(64位)
?單繼承?基類成員 + 派生類成員 + 單vptrBase(8)+Derived(4)=12
?多重繼承?按聲明順序排列各基類子對象 + 派生類成員Base1(8)+Base2(8)+Derived(4)=20
?虛繼承?添加虛基類指針,共享基類子對象額外增加8字節指針1

二、編譯器隱式生成構造函數的五大場景

2.1 合成默認構造函數觸發條件
  1. ?成員類含默認構造?
class Member { public: Member(){} }; 
class Container { Member mem; };  // 編譯器生成Container()
  1. ?基類含默認構造?
class Base { public: Base(){} };
class Derived : Base {};         // 生成Derived()調用Base()
  1. ?類聲明虛函數?
    虛函數表初始化需在構造函數中完成1

  2. ?虛基類存在?
    虛繼承導致編譯器生成構造器處理共享基類1

  3. ?成員變量就地初始化?

class Time { int Second{0}; };   // 生成構造函數初始化Second
2.2 合成拷貝構造函數的四種情況
  1. ?成員變量含拷貝構造?
class Member { public: Member(const Member&); };
class Holder { Member m; };      // 生成Holder(const Holder&)
  1. ?基類含拷貝構造?
    派生類未定義時調用基類拷貝構造

  2. ?涉及虛函數?
    確保vptr正確指向派生類虛表1

  3. ?存在虛基類?
    虛基類指針需特殊處理


三、關鍵機制解析與性能優化

3.1 this指針動態調整機制
class Base { public: virtual void func(); };
class Derived : Base { public: void func(); };Derived d;
Base* pb = &d;
pb->func();  // 調用Derived::func(),this自動調整為Derived地址

底層原理:通過虛函數表定位函數地址,調整this指向實際對象子部分5

3.2 深淺拷貝的工程實踐

?淺拷貝風險案例?:

class ShallowCopy {int* data;
public:ShallowCopy(const ShallowCopy& src) : data(src.data) {} // 危險!
};

?深拷貝解決方案?:

class DeepCopy {int* data;
public:DeepCopy(const DeepCopy& src) : data(new int(*src.data)) {}~DeepCopy() { delete data; }
};
3.3 成員初始化列表的強制使用場景
場景示例
?const成員?const int id;
?引用成員?std::string& ref;
?基類帶參構造?Derived() : Base(42) {}

性能提示:初始化列表直接初始化成員,避免"先默認構造再賦值"的開銷3


四、內存優化策略總結

  1. ?對齊控制?
  • 使用 #pragma pack(1) 禁用填充(犧牲性能節省空間)
  • 調整成員順序減少填充(按成員大小降序排列)6
  1. ?虛函數優化?
  • 避免無意義的虛函數(每個虛函數增加vtable條目)
  • 優先使用 final 類終止繼承鏈
  1. ?移動語義應用?
class ResourceHolder {std::vector<int> data;
public:ResourceHolder(ResourceHolder&& tmp) : data(std::move(tmp.data)) {}  // 避免深拷貝
};

附:內存布局驗證技巧

#include <iostream>
#include <cstddef>struct Test {virtual void foo() {}int a;char b;
};int main() {std::cout << "Size: " << sizeof(Test) << "\n";      // 64位輸出16std::cout << "Offset a: " << offsetof(Test, a);     // 輸出8std::cout << "Offset b: " << offsetof(Test, b);     // 輸出12
}

通過offsetof宏和調試器(GDB)可實時驗證內存布局4,5

?核心準則?:理解編譯器隱式行為 + 顯式控制關鍵內存操作 = 高性能C++類設計

Reference

c++新經典:對象模型

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

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

相關文章

Fastapi框架總覽與核心架構

Fastapi框架總覽與核心架構 FastAPI 是一個基于 Python 的現代 Web 框架&#xff0c;專注于 高性能、高并發 和 開發效率&#xff0c;特別適合構建 異步 API 服務、微服務接口&#xff0c;同時在大模型接口封裝中也廣泛應用。它基于 Starlette&#xff08;異步 Web 框架&#x…

高并發四種IO模型的底層原理

高并發四種IO模型的底層原理 1 IO讀寫的基本原理 為了避免用戶進程直接操作內核&#xff0c;保證內核安全&#xff0c;操作系統將內存&#xff08;虛擬內存&#xff09;劃分為兩部分&#xff1a;一部分是內核空間(Kernel-Space)&#xff0c;另一部分是用戶空間(User-Space)。在…

騰訊云短信實戰:Spring Boot接入YML配置與簽名/模板/發送/統計/狀態/號碼包工具類詳解

下面是一個Spring Boot集成騰訊云短信服務的詳細示例&#xff0c;包含配置和6個工具類&#xff08;簽名、模板、發送、統計、狀態&#xff09;&#xff0c;采用YML配置&#xff1a; 1. 添加Maven依賴 <dependency><groupId>com.tencentcloudapi</groupId>&…

【Java篇】IntelliJ IDEA 安裝與基礎配置指南

序 本篇文章將介紹IDEA 2023 版本。 提高開發人員的生產力。無論您是剛開始接觸編程的新手&#xff0c;還是經驗豐富的開發專家。 一&#xff1a;官網下載安裝包&#xff1a; IDEA下載鏈接 這個版本可以根據自己的需要選擇。 二、安裝方法 雙擊進這個.exe文件 這里要選擇合…

2-Nodejs運行JS代碼

2-Nodejs運行JS代碼 創建一個 js 文件編寫 JS 代碼 要注意的是&#xff0c;在nodejs環境中不能操作瀏覽器 DOM 對象相關的api&#xff0c;在Nodejs 中運行 JS 代碼 按住 shift 鍵&#xff0c;在 js 文件所在文件夾空白處右鍵&#xff0c;選擇 Powershell 窗口執行如下命令&…

vue中使用西瓜播放器xgplayer (封裝)+xgplayer-hls 播放.m3u8格式視頻

1.西瓜播放器官網 http://h5player.bytedance.com/guide/2.安裝 # 最新穩定版 $ npm install xgplayer對于已有項目也可以通過 CDN 引入&#xff0c;代碼如下&#xff1a; <script src"//unpkg.byted-static.com/xgplayer/2.31.2/browser/index.js" type"tex…

2025-07-15通過邊緣線檢測圖像里的主體有沒有出血

本節觀點&#xff1a;一個好的提問就已經解決了問題的90%。 對于問題的描述正確與否決定了解決問題的方法和路徑&#xff0c;所以我們在AI時代必須要學會正確的描述問題和表達問題&#xff0c;否則即使有AI輔助也是很難精準的解決問題。 我的問題&#xff1a; 如何利用代碼從圖…

【Docker基礎】Dockerfile指令速覽:文件與目錄操作指令詳解

目錄 引言 1 ADD&#xff1a;高級文件復制與解壓 1.1 指令簡介 1.2 語法 1.3 功能詳解 1.4 使用場景 1.5 執行流程 1.6 示例 1.7 注意事項 2 WORKDIR&#xff1a;設置工作目錄 2.1 指令簡介 2.2 語法 2.3 使用場景 2.4 創建流程 2.5 示例 2.6 注意事項 3 VOLU…

Python 程序設計講義(2):Python 概述

Python 程序設計講義&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 語言的發展史 Python 語言誕生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式發布。 2008 年 12 月&#xff0c;Python3.0 正式發布。 Python3.0 在語法層面和解釋器內部做了很多重大…

多租戶SaaS系統中設計安全便捷的跨租戶流程共享

四維協同架構??,結合動態授權、加密傳輸、行為審計和智能策略 一、??權限控制體系?? 1. ??動態權限模型? ? 2. ??授權策略實現?? ??RBAC+ABAC混合模型?? 在流程表增加shared_tenants字段存儲授權信息,結合屬性動態校驗: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 簡單來說&#xff0c;Spring Bean 就是一個由 Spring IoC 容器負責創建、管理和裝配的 Java 對象。 它不是一種新的技術&#xff0c;它本質上還是一個普普通通的 Java 對象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 總線及設備入門學習專欄 5.1.1 -- PCIe PERST# 信號的作用】

文章目錄 PCIe PERSTN#PERST# 信號作用概述簡要定義PERST# 的關鍵功能PERST# 的時序圖示意Synopsys PCIe EP IP 中 PERST# 的作用關鍵信號接口典型復位流程示例代碼(Verilog for Synopsys PCIe)PERST# 使用場景舉例(Synopsys PCIe EP)1. 系統上電初始化2. 熱復位特定設備3.…

使用python的pillow模塊將圖片轉化為灰度圖,獲取值和修改值

使用python的pillow模塊可以將圖片轉化為灰度圖&#xff0c; 可以獲取灰度圖的特定點值&#xff0c;區域值&#xff0c; 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

記憶力訓練day41

通常是一個地點記2組詞 數字和人體記憶宮殿更注重 即時性&#xff1b;地點記憶宮殿是長久性

自動微分模塊

一.前言本章節我們是要學習梯隊計算&#xff0c;?動微分&#xff08;Autograd&#xff09;模塊對張量做了進?步的封裝&#xff0c;具有?動求導功能。?動微分模塊是構成神經?絡 訓練的必要模塊&#xff0c;在神經?絡的反向傳播過程中&#xff0c;Autograd 模塊基于正向計算…

深度學習·目標檢測和語義分割基礎

邊緣框 不是標準的x&#xff0c;y坐標軸。邊緣框三種表示&#xff1a;左上右下下坐標&#xff0c;左上坐標長寬&#xff0c;中心坐標長寬 COCO 目標檢測數據集的格式&#xff1a;注意一個圖片有多個物體&#xff0c;使用csv或者文件夾結構的格式不可取。 錨框算法 生成很多…

ffmpeg音視頻處理大綱

FFmpeg 是一個功能強大的開源音視頻處理工具集&#xff0c;其核心代碼以 C 語言實現。下面從源碼角度分析 FFmpeg 如何實現轉碼、壓縮、提取、截取、拼接、合并和錄屏等功能&#xff1a; 一、FFmpeg 核心架構與數據結構 FFmpeg 的源碼結構圍繞以下核心組件展開&#xff1a; lib…

網絡安全小練習

一、docker搭建 1.安裝 2.改變鏡像源&#xff08;推薦國內鏡像源&#xff1a;阿里云鏡像源&#xff09; 登錄阿里云容器鏡像源服務&#xff08; 阿里云登錄 - 歡迎登錄阿里云&#xff0c;安全穩定的云計算服務平臺 &#xff09; 復制系統分配的專屬地址 配置 sudo mkdir …

數據結構——順序表的相關操作

一、順序表基礎認知?1.順序表的定義與特點?順序表是數據結構中一種線性存儲結構&#xff0c;它將數據元素按照邏輯順序依次存儲在一片連續的物理內存空間中。簡單來說&#xff0c;就是用一段地址連續的存儲單元依次存放線性表的元素&#xff0c;且元素之間的邏輯關系通過物理…

2025最新國產用例管理工具評測:Gitee Test、禪道、藍凌測試、TestOps 哪家更懂研發協同?

在快節奏的 DevOps 時代&#xff0c;測試用例管理已不再是 QA 的獨角戲&#xff0c;而是穿透需求—開發—測試—交付全流程的核心樞紐。想象一下&#xff0c;如果用例結構混亂&#xff0c;覆蓋不全&#xff0c;甚至丟失版本變更歷史&#xff0c;不僅協作亂&#xff0c;還影響交…