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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…