c++内存布局

cpp——类——内存布局 阅读详情

写好了代码只是第一步,接下来还需要编译生成对应的二进制才能使用(预处理,编译,汇编,链接)。

那么在运行的时候,代码和数据在内存中都是怎么分布的呢?c的内存布局是怎样的呢?c++的内存布局是怎样的呢?

有一点值得注意,C语言和C++的内存布局是不一样的,这也就是平日里搜索c++内存布局的文章内容总是很相似但还不相同的原因,有些人没有对比清楚两者区别!我以前也是这样的。

C内存布局  

c语言内存布局分为5部分:初始化数据段,未初始化数据段,代码段、堆区和栈区

  • 初始化数据段分为只读数据和读写数据。
    • 只读数据如初始化的被const修饰的变量或者一些常量,比如`char *str = "abc";`,常量"abc"就存储在只读寄存器中。如果定义成`char str[] = "abc"`,代表的是一个数组,可能定义在栈上,也可能定义在初始化数据段的读写数据中,主要看定义的位置。
    • 读写数据存储被定义了初始值的一些变量,包括初始化过的全局变量和被static修饰的静态变量
  • 未初始化数据段存储未被初始化的变量,也称之为BSS段,即Block Started by Symbol。未被初始化的变量被默认初始化为0,包括全局变量和被static修饰的静态变量
  • 代码段存储代码编译出来的二进制,程序执行的时候由依次执行
  • 堆区存储程序中动态申请出来的空间(malloc出来的,注意free释放内存,否则会出现内存泄漏问题)
  • 栈区存储程序中的局部变量。堆与栈的生长方向相反:栈在内存中也是一种数据结构中栈的样子,是向地址小的方向生长,在linux中可以查看栈的大小`ulimit -s`;堆在内存中的结构如同数据结构中的堆,向着方向大的地方生长,堆比较大,比较接近计算机内存的大小。

 

C++内存布局  

C++的内存布局同样分为5个部分:

  • 常量存储区:存储常量字符串,如同C语言内存布局中的初始化数据段的只读数据。
  • 全局变量/静态存储区:如同名字,存储这两类数据,不再区分是否初始化,更加直观容易理解了。包括全局变量,静态变量和常量
  • 代码段:同C语言中代码段
  • 堆区:因为在c++中多了new这个操作符,在堆区中也区分为new的堆区和malloc的堆区。new出来的空间在程序退出时候,操作系统帮忙清理。
  • 栈区:同C语言中栈区

 

由内存布局的差异而引发出来的问题

  1. 静态变量的问题
    1. 静态变量只在当前文件中生效,其他文件中是看不见的。如果想要在文件中看到另一个文件中的变量,需要使用extern关键字进行修饰,表示该变量已经在其他文件中声明了,此处只是声明一下区通过编译,在link阶段会找到定义的位置进行链接。
    2. 静态局部变量和静态变量,通过static修饰的变量会扩大变量的生命周期,在程序运行的阶段一直存在;而局部变量是存储在栈上的,当当前函数(block)退出后,里面的局部变量就会被退栈释放掉
  2. new和malloc的区别
  3. 堆和栈的区别

参考文章:

 

C和C++的内存布局 1.1 内存分布图 Stack段:局部变量存放区域。 heap段:用户动态分配内存区域。 bss段:存放未初始化的全局或静态变量内存区域。(Block Started by Symbol) 数据段:通常指存放已初始化的全局变量的内存区域。(data segment) 代码段:通常指存放程序执行代码的一块内存区域。(code segment/text segment) 1.2 在C中分为5个存储区... 阅读详情

相关推荐

从课堂笔记到动手实践:用Multisim仿真高频谐振功放(丙类)的完整流程

本文详细介绍了使用Multisim仿真高频谐振功放(丙类)的完整流程,从仿真环境准备到电路搭建、偏置网络设计、信号注入与波形观测,再到效率优化与性能验证。通过14个关键操作步骤,帮助读者将高频电子线路的理论知识转化为动手实践,深入理解丙类功放的非线性工作状态和效率优化技巧。

weixin_30701575的博客 520

[C++] 内存布局完整解读

右值引用和移动语义:虽然这些特性主要影响临时对象的处理和函数参数的传递,但它们也可能间接影响内存布局,因为它们允许更高效的资源转移和避免不必要的复制。总之,C++11在内存布局方面提供了更多的控制和标准化,使得开发者能够更精确地管理数据结构在内存中的排列,同时也提高了代码的可移植性和性能。继承和多重继承:在多重继承中,基类的数据成员会先于派生类的数据成员排列,且每个基类的数据成员会按照它们在基类中的顺序排列。统一的内存对齐模型:C++11提供了跨编译器和平台的一致内存对齐模型,这有助于提高代码的可移植性。

wangdsh的博客 3464

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2127

C++程序内存布局

C++程序内存布局探讨(一) 刘昕 重庆大学软件学院 摘要: 本文探讨了C++程序内存布局的基础知识,对堆、栈、全局数据区和代码区的概念进行了简单介绍,并介绍了内存对齐和进程地址空间(虚拟内存)方面的知识。 今天一大早起来,收到外校的同学传给我的一道C++面试题,该公司做Windows平台下的C++开发。面试题有一道考C++程序内存布局,很具有代表性。 已知有这样一段代码:

Stone_Sky 2254

解决linux 2.5G网卡驱动问题

解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自

poorguy_aos的博客 1万+

SKF SimPro Quick 4.8.1发布

发布说明可以在SimPro手册的SKF SimPro Quick应用程序的一般部分下找到(帮助→SKF SimPro快速手册→一般→发布说明)。请删除旧版本,请备份您存储在C:\SKF SimPro xxx\files文件夹中的文件以及所有自定义报告模板和表格。我们很高兴地通知您,我们的轴承应用工程软件SKF SimPro Quick 4.8.1可供下载。将新的安装文件下载到本地计算机后,双击它安装向导将打开(按照说明操作)3.安装后,在本地机器上启动SKF SimPro Expert软件。

小韩的博客 1820

C/C++语言的内存四区(栈区,堆区,全局区,代码区)(附图详解)

栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段的后面。数据段:数据段也属于静态内存分配。该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的。

木牛的博客 5182

ERROR conda.core.link:_execute(502): error occurred while installing conda-forge::setuptools 解决方案

本文主要介绍了ERROR conda.core.link:_execute(502): An error occurred while installing package mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge::setuptools-65.5.1-pyhd8ed1ab_0.FileNotFoundError(2, 系统找不到指定的文件。, None, 2) 解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

C++内存布局(一)

C++内存布局

Mr.Sugarcane 821

微信小程序 - 获取当前日期时间(函数封装)

效果图 前言 摘自微信小程序demo程序中utils.js方法。 普通newDate()出来的日期时间,并不是我们想要的格式,所以要进行格式整理。 解决方案 打开utils.js文件(随意),复制以下代码: /** *获取当前时间 *@description自定义日期分钟秒数 *@param{Object}date-newData()对象 *@returnString */ functionformatTime(date){ //年月日

🏆 前端领域优质创作者 2843

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2809

浅析C++内存布局

简单总结下C++变量在内存中的布局和可执行文件相关的知识。暂未涉及虚函数,虚函数表,类的继承和多态等C++对象的内存模型。对象的内存模型可能够写一本书了。推荐经典书籍《深度探索c++对象模型》

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 2591

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

[cpp] C++对象内存布局分析

几年前整理的,最近有人问起,先放在这里,改天整理一下,前端时间忙,该开始整理一下笔记里的东西了,以后定时更新博客咯。 源码下载 单继承模式下,虚继承 1: #ifndef OM_SINGLE_VIRTUAL_INHERITANCE_H_ 2: #define OM_SINGLE_VIRTUAL_INHERITANCE_H_ 3: // 单继承模式下,虚拟继...

weixin_30293135的博客 1636

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++对象的内存布局

本文介绍一个C++ struct/class在内存中的布局是什么样的,包括数据成员和方法成员,静态成员,非静态成员,虚拟成员在内存中的位置;本文不涉及(多)继承情况下对象内存布局的细节。

giantpoplar的专栏 4172

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 对象的内存布局(下)

   C++ 对象的内存布局(下) 陈皓http://blog.youkuaiyun.com/haoel  <<<点击这里查看上篇  重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。  其类继承的源代码如下所示。其中,每个类都有两个变量,一个是

陈皓专栏 【空谷幽兰,心如皓月】 7万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++ 内存布局

深入理解 C++ 内存布局对于编写高性能代码至关重要。本文从进程虚拟内存、数据对齐、对象布局等层面系统分析 C++ 的内存组织方式。

z1ztai的博客 1079

C++内存布局(上)

本文主要介绍C++对象在内存中占用内存的大小以及各个字段的位置布局。一、字节对齐一个基本的对象在内存中占用的内存大小主要为:各字段大小+字节对齐为什么要字节对齐字节对齐的根本原因在于CPU存取数据的效率问题。为了提高效率,计算机从内存中取数据是按照一个固定长度的。比如在32位机上,CPU每次都是取32bit数据的,也就是4字节。因此如果一个int型整数的起始地址是0x00000004,则它是字节对齐

qinm的专栏 5670

C++类的内存布局

关于C++中类的内存布局,是比较基础而重要的一个内容。先转一篇老文章,因其使用了Visual Studio的特殊功能而能够写得很简单清晰,不过当时作者用的应该是32机器,故指针大小是4字节而不是8字节。 笔者手头没有Visual Studio,故转载之。也可以按陈皓早年的文章用打印地址的方式分析。不过因为本文的方式非常清晰易懂,故还是想转载下这篇。遇到与64位的不同处,本文会略作说明。 本文对原文略作了一些增删: 增加了前2节,对第3节做了不少的删减合并与结构调整,不过基本保留了原图与代码。 原文地址:

FinixLei的专栏 (https://github.com/FinixLei) 2152

C++内存模型的内存布局

本文章介绍了C++程序的内存布局,并附有一段演示**数据区**和**栈区**存储不同类型变量的代码示例。

liukuande的博客 1059

C++ 对象内存布局

可能会对 C++ 对象的内存布局产生影响的因素: 对象的数据成员变量 对象的一般成员函数 对象的虚成员函数 对象继承 - 父类不包含虚函数 对象继承 - 父类包含虚函数 对象多继承 - 父类不包含虚函数 对象多继承 - 父类包含虚函数 对象虚继承 动态类型信息(这里不讨论) 通过汇编代码看虚函数调用过程 这些特性的实现常常因操作系统平台和编译器/ABI 而异,这里的分析主要基于 linux x86_64 平台上的 GCC 11.2.0/G++ 11.2.0 的行为进行。 一般 C++ 对象的内存布局

tq08g2z的专栏 1458

C++ 对象的内存布局

C++ 对象的内存布局是一个重要的概念,它影响着对象的存储、访问效率以及内存使用。理解对象的内存布局有助于优化程序性能和避免潜在的内存问题。以下是 C++ 对象内存布局的主要组成部分:数据成员是对象的状态表示,通常是类中定义的变量。数据成员的存储顺序通常是按照它们在类中声明的顺序排列。需要注意的是,编译器可能会在数据成员之间插入填充(padding),以满足对齐要求。对齐是指数据在内存中存储时的地址要求。不同类型的数据可能有不同的对齐要求。例如, 通常需要在 4 字节对齐的地址上存储,而 可能需要在 8

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1057

C++ 内存布局:内存布局基础

C++中的内存分布,基础篇

飞来飞去的博客 1298

C++继承的内存布局

单一继承 可见以下几个方面: 1)虚函数表在最前面的位置。 2)成员变量根据其继承和声明顺序依次放在后面。 3)在单一的继承中,被overwrite的虚函数在虚函数表中得到了更新。 多重继承 我们可以看到: 1) 每个父类都有自己的虚表。 2) 子类的成员函数被放到了第一个父类的表中。 3) 内存布局中,其父类布局依次按声明顺序排列。 4) 每个父类的虚表中的f()函数都被overw...

Waves___的博客 4323

C++类对象在内存中的布局

目录 一、前言 二、C++ 类对象的内存布局 2.1 只有数据成员的对象 2.2 没有虚函数的对象 2.3 拥有仅一个虚函数的类对象 2.4 拥有多个虚函数的类对象 三、继承关系中的C++类对象内存分布 3.1 存在继承关系且本身不存在虚函数的派生类的内存布局 ​3.2本身不存在虚函数(不严谨)但存在基类虚函数覆盖的单继承类的内存布局 3.3 定义了基类没有的虚函数的单继承的类对象布局 3.4 多继承且存在虚函数覆盖同时又存在自身定义的虚函数的类对象布局 3.5如果第1个直接基...

qq_41687938的博客 3601
上一篇: c++只在堆和只在栈上创建对象
下一篇: C++Linux后台开发
hellozmz
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值