C++面試——內存

一、簡述堆和棧的區別

維度棧(Stack)堆(Heap)
生命周期隨函數調用自動創建/銷毀由程序員或垃圾回收器控制
分配速度極快(僅移動指針)慢(需查找空閑塊、維護元數據)
空間大小較小(通常 MB 級)較大(受系統內存限制)
連續性連續內存,自上而下生長非連續,易產生碎片
典型用途局部變量、函數參數動態數組、對象、大內存
線程安全每個線程獨立棧多線程共享,需同步
示例int a = 10;int *p = new int(10);

一句話:棧像自動售貨機,隨拿隨走;堆像倉庫,按需申請、手動歸還。


二、簡述C++的內存管理

C++ 的內存管理可簡化為 “三區域、兩手段、一原則”:

  1. 三區域

    • :函數幀自動創建/銷毀,速度最快。
    • new/deletemalloc/free 手動申請/釋放,空間大。
    • 靜態/全局區:編譯期確定,程序運行期間一直存在。
  2. 兩手段

    • 手動管理:裸指針 + new/delete,高效但易漏/懸垂。
    • RAII + 智能指針std::unique_ptrstd::shared_ptr/weak_ptr 把資源生命周期綁定到對象生命周期,自動釋放。
  3. 一原則

    資源即對象(RAII):獲得資源即構造對象,離開作用域即釋放資源——讓編譯器替你做 delete。

一句話

用智能指針和 RAII 包裝資源,告別手動 delete,把內存管理交給作用域。


三、malloc和局部變量分配在堆還是棧?

分配方式所在區域生命周期示例
malloc / new堆(Heap)程序員手動 free/delete 或程序結束int* p = (int*)malloc(4);
局部變量棧(Stack)離開作用域自動銷毀int x = 10;

一句話:malloc 永遠落在堆;局部變量永遠落在棧。


四、程序有哪些section,分別的作用?程序啟動的過程?怎么判斷數據分配在棧上還是堆上?

在這里插入圖片描述
(1)、典型可執行文件(ELF)里的 section(段)

(按低→高地址排列,括號內為常見段名)

Section作用生命周期
.text機器指令(代碼)只讀,整個進程
.rodata只讀常量(字符串、const 全局)同上
.data已初始化的全局/靜態變量整個進程
.bss未初始化的全局/靜態變量(默認 0)整個進程
heap運行時動態分配(malloc/new程序員控制
共享庫映射區mmap 的 .so 文件、匿名映射按需加載
stack函數幀、局部變量、返回地址隨函數進出
命令行參數 & 環境變量argc, argv, envp進程啟動時由內核放進來
內核空間內核代碼/數據(用戶不可見)整個系統

(2)、程序啟動的 9 步流程(Linux 為例)

  1. Shell fork → 創建子進程
  2. 內核 execve 裝載 ELF
  3. 讀 ELF header → 解析各個 section 偏移和長度
  4. 建立虛擬地址空間:
    • .text/.rodata/.data/.bss 映射進來
    • 為 heap 預留一段匿名映射(brk 起點)
    • 預留 stack 區域并設置 RSP
  5. 裝載動態鏈接器 (ld-linux.so) → 映射到共享區
  6. 重定位 & 符號解析 → 把 .so.text/.data 填進共享區
  7. 初始化 .bss 為 0
  8. 運行 .init / __libc_start_main → 調全局對象構造函數
  9. 跳轉到 main → 用戶代碼開始

(3)、如何判斷數據在 棧 還是 堆?

場景所在區域判斷技巧
int x = 5;作用域結束即銷毀
int *p = new int(5);離開作用域后 *p 仍有效,需要 delete
static int x;全局區(.data/.bss)整個進程生命周期
`const char *s = “hello”;` 只讀段(.rodata)地址位于低地址只讀區域
malloc(…) 返回值gdb / pmap / cat /proc/$$/maps 可見匿名映射

最實用的運行時判斷

pmap -x <pid>
  • 區間名 [stack] → 棧
  • 區間名 [heap] → 堆
  • 區間名 /lib/ld-linux.so → 共享區

一句話總結

代碼在 .text,常量在 .rodata,全局/靜態在 .data/.bss,動態在 heap,局部在 stack;啟動時內核按 ELF 把段映射進虛擬地址空間,運行時看作用域和分配 API 即可區分棧與堆。



五、初始化為0的全局變量在bss還是data

初始化為 0(或全零)的全局變量 放在 .bss,而不是 .data

.data 只收“非零初始值”的全局/靜態變量。)

int g1 = 0;          // .bss
int g2 = 42;         // .data
static int s1 = 0;   // .bss
static int s2 = 1;   // .data

一句話:

零初始化的全局/靜態變量進 .bss,非零才進 .data



六、簡述C++中內存對齊的使用場景

一句話:

“讓數據在內存里按照 CPU 最喜歡的地址倍數排排坐,從而少一次訪存、多一次 SIMD。”

1?? 典型場景

場景原因關鍵詞
結構體/類成員布局避免空洞、保證原子變量對齊#pragma pack, alignas
SSE/AVX 指令128/256/512 bit 必須 16/32/64 字節對齊alignas(16)
malloc/new 無法滿足自定義對齊內存std::aligned_alloc, std::aligned_storage
共享內存/網絡協議跨平臺二進制兼容alignas(uint32_t)
原子操作std::atomic<T> 要求 T 自然對齊alignof(std::max_align_t)

2?? 一行代碼示例

struct alignas(32) Vec4 {float x, y, z, w;
};          // 起始地址一定是 32 的倍數,可直接 `_mm256_load_ps`

3?? 口訣

“原子對齊保并發,SIMD 對齊保速度,協議對齊保兼容。”



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

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

相關文章

UVM驗證(三)—UVM機制(1)

目錄 &#xff08;一&#xff09;Factory工廠機制 1. 工廠機制核心邏輯&#xff1a;“注冊 - 創建 - 覆蓋” 2. 代碼映射&#xff1a;從概念到實現 3. 實驗目標&#xff1a;用 dadd_fixen_driver 固定 data_en1 4. 工廠機制的價值&#xff1a;“靈活驗證的基石” 5. 常見…

前往中世紀 送修改器(Going Medieval)免安裝中文版

網盤鏈接&#xff1a; 前往中世紀 免安裝中文版 名稱&#xff1a;前往中世紀 送修改器&#xff08;Going Medieval&#xff09;免安裝中文版 描述&#xff1a; 在Going Medieval的世界中&#xff0c;黑暗時代的社會已瀕臨崩潰。14世紀末瘟疫肆虐&#xff0c;全球95%的人口因…

Font Awesome 參考手冊

Font Awesome 參考手冊 引言 Font Awesome 是一個功能強大的圖標庫,它允許開發者通過簡單的 CSS 類來添加圖標到網頁中。本手冊旨在為開發者提供全面的 Font Awesome 使用指南,包括圖標選擇、樣式定制以及常見問題解答。 圖標選擇 圖標分類 Font Awesome 提供了多種類別…

源網荷儲一體化零碳智慧工業園區建設

針對傳統工業園區等電力消納大戶存在的供電模式單一、能源管理錯雜、園區人員設備安全統籌不到位等諸多問題&#xff0c;通過AI分析及物聯網等新技術和自研交直流關鍵設備的應用&#xff0c;在三維場景中構建集智慧能源、智慧安防、碳排放管理及智慧運營等功能于一體的新型零碳…

MySQL表操作(DDL)

MySQL表操作創建表查看表結構修改表結構增加一列刪除一列修改某一列的屬性修改某一列的名字修改某一列的屬性和名字插入幾條信息刪除表創建表 語法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collat…

【總結】Python多線程

【總結】Python多線程備注一、基本概念二、備注 2025/08/15 星期五 最近用到了python的多線程發現和其他語言有點不同記錄一下 一、基本概念 首先要理解一下線程、進程和協程的概念 線程&#xff08;Thread&#xff09;&#xff1a;是計算機能夠調度的最小計算單位 進程&…

【c++深入系列】:萬字詳解模版(下)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 成功沒有標準答案&#xff0c;但堅持永遠是必選項 ★★★ 本文前置知識&#xff1a; 模版(上&#xff09; 那么在之前的文章中我們展示…

Docker部署美化SunPanel導航頁

使用Cloudflare Tunnels穿透的地址:星霜導航 由于是使用的iStore里面的SunPanel導航頁,只是基本的功能 頁腳配置 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" conte…

支持向量機的原理和案例解析

支持向量機的原理和案例解析一、支持向量機的核心目標&#xff1a;間隔最大化步驟1&#xff1a;定義分離超平面步驟2&#xff1a;定義樣本到超平面的距離&#xff08;間隔&#xff09;步驟3&#xff1a;間隔最大化的目標步驟4&#xff1a;簡化目標函數二、通過拉格朗日乘子法求…

【教程】Nginx 源碼安裝

開發環境&#xff1a;VMWare 操作系統&#xff1a;紅帽 Linux 8 ? 前言 以離線環境安裝為前提&#xff0c;需準備以下 rmp 包內容&#xff1a; gccmakepcre-develzlib-developenssl-devel 如何準備可參考【教程】準備離線可用的 RPM 包 ? 流程 準備離線包 # 安裝 rpm yu…

俄羅斯信封套娃問題-二維最長遞增子序列

354. 俄羅斯套娃信封問題 - 力扣&#xff08;LeetCode&#xff09; Solution 對一個維度從小到大排序&#xff0c;然后對另外一個維度求最長上升子序列即可。 class Solution { public:struct node {int w, h;node(int w, int h) {this->w w;this->h h;}};static bool…

區塊鏈:用數學重構信任的數字文明基石

在數字經濟浪潮席卷全球的今天&#xff0c;虛擬與現實的融合正面臨一個根本性挑戰——如何讓數字世界的"承諾"擁有與現實世界同等的可信度&#xff1f; 當我們在電商平臺下單時&#xff0c;如何確保商品質量與描述一致&#xff1f;當企業簽署電子合同時&#xff0c;如…

Go語言defer機制詳解與應用

一、defer作用Go語言的defer關鍵字提供了一種延遲執行機制&#xff0c;它能確保指定的函數調用在當前函數返回前被執行。這一特性常用于資源釋放和異常處理場景。二、defer基本特性&#xff08;1&#xff09;執行時機&#xff1a;defer 語句會在外層函數返回前執行&#xff0c;…

服務器安全防護詳細介紹

一、方案概述隨著信息技術的飛速發展&#xff0c;服務器作為企業數據存儲、業務運行的核心載體&#xff0c;其安全性至關重要。本服務器安全防護方案旨在通過多層次、全方位的安全防護策略&#xff0c;構建一個完整的服務器安全防護體系&#xff0c;有效抵御各類安全威脅&#…

網站與政務新媒體自查情況的報告工具功能

要高效地完成網站與政務新媒體的自查&#xff0c;并生成報告&#xff0c;通常需要借助專業的自動化巡檢工具。這些工具能夠模擬人工檢查&#xff0c;但速度更快、覆蓋面更廣&#xff0c;并且能將發現的問題匯總成結構化的報告。一、網站與政務新媒體自查報告的工具實現功能這類…

JVM核心原理與實戰優化指南

一、成為卓越的Java開發者 無論你是大學生還是資深工程師&#xff0c;學習JVM都至關重要。你可能是為了&#xff1a; 征服技術面試進行系統調優深入理解Java生態 學習路徑建議&#xff1a; 從Java語言本質切入&#xff0c;逐步深入JVM核心機制&#xff0c;兼顧不同背景學習者…

TCP/IP、socket、http

區分與聯系 TCP/IP 是底層規則,規定數據如何傳輸; Socket 是操作 TCP/IP 的工具,讓程序能實現通信; HTTPS 是上層應用,用 Socket 調用 TCP/IP 協議,實現安全的數據傳輸。 應用層:HTTPS(基于 HTTP + SSL/TLS)| | socket連接了應用層和傳輸層↓ 傳輸層:TCP(可靠…

Go語言中的指針接收者

Go語言中的指針接收者&#xff08;Pointer Receiver&#xff09;與Java類中的方法在設計思想上確實有相似之處&#xff0c;尤其在對象狀態修改和性能優化上&#xff0c;但兩者在實現機制和語言哲學上存在顯著差異。以下從核心特性、設計對比和應用場景展開分析&#xff1a;一、…

計算機視覺(opencv)實戰三——圖像運算、cv2.add()、cv2.addWeighted()

圖像運算詳解&#xff1a;加法運算與加權運算在數字圖像處理中&#xff0c;圖像運算是基礎且常用的操作之一。它能夠對兩幅圖像或圖像與常數進行加減乘除&#xff0c;從而實現亮度調整、融合疊加、特效制作等功能。本文將重點介紹 OpenCV 中的圖像加法運算與加權運算&#xff0…

Redis核心架構

一、核心模塊如圖 Client 客戶端&#xff0c;官方提供了 C 語言開發的客戶端&#xff0c;可以發送命令&#xff0c;性能分析和測試等。網絡層事件驅動模型&#xff0c;基于 I/O 多路復用&#xff0c;封裝了一個短小精悍的高性能 ae 庫&#xff0c;全稱是 a simple event-driven…