首页 > 系统相关 >C++ 内存分区

C++ 内存分区

时间:2023-11-12 18:56:46浏览次数:36  
标签:函数 分区 局部变量 C++ bss 内存 全局变量 分配

C / C++ 内存管理

C / C++内存分布

转载https://www.coonote.com/note/cpp-memory-management.html

1699708671327.png
C/C++程序内存分配的几个区域:

  • 栈区(stack)
    在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  • 堆区(heap)
    一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  • 数据段(静态区)
    (static)存放全局变量、静态数据。程序结束后由系统释放。
  • 代码段
    存放函数体(类成员函数和全局函数)的二进制代码
    可以使用
    使用size命令和objdump来查看目标文件的结构和内容:
    1699711151659.png

bss段:

bss段(bss segment)通常是指用来存放程序中未初始化的全局变量未初始化的(全局以及局部)静态变量的一块内存区域。
bss是英文Block Started by Symbol的简称。
bss 段,不为数据分配空间,只是记录数据所需空间的大小;
bss 段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在data段后面
bss段属于静态内存分配。

data段:

数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

用来存放有初始值的全局变量初始化的(全局以及局部)静态变量(static 关键字定义的变量)

text段:

代码段(code segment/text segment)
通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。

在代码段中,也有可能包含一些只读的常数变量,例如字符串常量,常量(const 关键字定义的变量)等

  • 通常text也可以分出一个rodata段 .rodata段 是 只读数据段,比如我们用const修饰的值就是放在这个区域的。
    1699785245024.png

stack 栈区

用来存放局部变量函数的参数返回值等,由编译器自动分配释放。如一个函数被调用后,产生的临时变量都会存到栈区的顶部,当函数完成后,会自动从顶部将刚使用的数据销毁。栈区的地址是从高地址向下增长的。

heap 堆区

用来动态内存分配,如 malloc , new 申请的内存,由程序员手动分配释放。程序中不释放,则程序结束时,由OS回收;

从不同的角度去看
1699783251851.png

总结

未初始化的全局变量、静态局部变量,存储在.bss段中,具体体现为一个占位符;
已初始化的全局变量、静态局部变量,存储在.data段中;
此外,非静态局部变量,都在栈中分配空间。
1699785294664.png

标签:函数,分区,局部变量,C++,bss,内存,全局变量,分配
From: https://www.cnblogs.com/stayuplater/p/17827562.html

相关文章

  • JVM内存泄漏的8种情况
    1静态集合类静态集合类,如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与JVM程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用但是因为长生命周期对象持有......
  • 68.Oracle的内存参数设置
    如果服务器是100G内存,那么Oracle的内存参数可以按照如下进行配置:altersystemsetsga_max_size=40000Mscope=spfile;altersystemsetstreams_pool_size=1200Mscope=spfile;altersystemsetlarge_pool_size=200Mscope=spfile;altersystemsetpga_aggregate_target=......
  • JVM系列-第7章-对象的实例化内存布局与访问定位-cnblog
    title:JVM系列-第7章-对象的实例化内存布局与访问定位tags:-JVM-虚拟机categories:-JVM-1.内存与垃圾回收篇keywords:JVM,虚拟机。description:JVM系列-第7章-对象的实例化内存布局与访问定位。cover:'https://gitee.com/youthlql/randombg/raw/master/lo......
  • 分类累加的内存数组结果
    问题:分类累加的内存数组结果下拉公式 =SUMIF(A$2:A2,A2,B$2)内存数组 =SUMIF(OFFSET(A2,,,ROW(1:5)),A2:A6,B$2)Offset组建多维引用,每个区域分别为A2、A2:A3、A2:A4、A2:A5、A2:A6,以此作为Sumif的第一参数条件区域,返回满足所有条件对应B列的结果。......
  • c++ extern关键字
    @[TOC]什么是extern?extern是C++中的一个关键字,用于声明一个全局变量或函数,但并不分配内存或提供定义。它的主要作用是告诉编译器这个变量或函数在其他源文件中定义,编译器不应该分配内存空间或生成代码,而应该等待链接器来解析它。使用extern声明变量//在一个源文件中定义一个......
  • C++零基础教程(抽象类和接口)
    (文章目录)前言本篇文章来讲解抽象类和接口的概念,抽象类和接口都需要依靠我们之前讲解的虚函数来实现,那么我们就来看看如何使用虚函数来实现抽象类和接口吧。一、抽象类概念抽象类是一种不能直接实例化(即创建对象)的类,它被用作其他类的基类或接口。抽象类通过声明纯虚函数(没有......
  • 一个操作系统的设计与实现——第8章 内存管理系统
    计算机上的任何程序,包括操作系统自己,都需要使用内存。因此,操作系统需要实现内存管理系统,以进行内存的分配和回收。在我们的操作系统中,内存管理系统由两部分组成:页分配器与页回收器。本章将实现这两个部分。8.1从虚拟地址到物理地址回顾CPU对内存地址的转换过程:使用段寄存器......
  • c++ function使用
    一、function介绍funciotn是从c++11开始支持的特性,使用它需要包含<functional>头文件在cppreference中解释为:类模板std::function是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达......
  • 哪些资源预分配了内存:e820
    在操作系统开始管理内存之前,首先要获取物理内存的信息,比如共有多少物理地址是可用的?有哪些物理地址是被ACPI(AdvancedConfigurationandPowerInterface)数据使用?这些信息从何而来?e820就是x86架构(包括x86_64)上的操作系统引导程序提供物理内存信息的功能。当请求BIOS中断号15H,......
  • 哪些资源预分配了内存:e820
    在操作系统开始管理内存之前,首先要获取物理内存的信息,比如共有多少物理地址是可用的?有哪些物理地址是被ACPI(AdvancedConfigurationandPowerInterface)数据使用?这些信息从何而来?e820就是x86架构(包括x86_64)上的操作系统引导程序提供物理内存信息的功能。当请求BIOS中断号15H,......