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

C++内存分布

时间:2024-05-06 13:56:40浏览次数:23  
标签:存储 变量 int C++ 分布 static 内存

内存分布

典型的C/C++内存表示有以下几部分构成

  • Text segment,存放代码段和只读常量的区域
  • Initialized data segment,通常叫做数据段,已经初始化的静态变量和全局变量存放的区域,如static int i = 5、全局变量int j = 10都存放在数据段
  • Uninitialized data segment(bss),未初始化的静态变量或者全局变量存放在bss(Block Started by Symbol)段,并且用0进行初始化。
  • Heap,动态内存分配时数据存放的位置
  • Stack,栈顶指针方向从自顶向下,与堆的方向相反,

参考:https://www.geeksforgeeks.org/memory-layout-of-c-program/

存储持续性、作用域、链接性

这里引入3个概念:

  • 存储持续性(storage duration)
  • 作用域(scope)
  • 链接性(linkage)

存储持续性

存储持续性就是数据保存在内存中的时间,C++11中有四种方案来存储数据。

  • 自动存储持续性,在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。这些变量在函数或代码段开始时创建,执行完函数或代码块时,它们的内存被释放。
  • 静态存储持续性,被static修饰的变量其内存在所有程序结束时才释放。
  • 线程存储持续性(C++11增加),如果变量是使用关键字thread_local 声明的,则其生命周期与所属的线程一样长。
  • 动态存储持续性,使用new运算符分配的内存一直存在,直到使用delete运算符将其释放或是程序结束。这种方式分配的内存,有时将其称为自由存储区或者是堆。

作用域、链接性

作用域即变量所作用的范围

链接性是指变量与其他单元如何实现共享

c++有5种变量存储方式:

在声明变量中有存储说明符(storage class specifier)或CV-限定符(cv-qualifier)。

存储说明符:

  • auto(C++11 表示自动类型判断)
  • register(C+11 指出变量是自动的)
  • static,变量不在任何函数中声明时链接性表示为内部链接性(即可以被文件内的所有单元访问),在某个函数中使用static声明时无链接性
  • extern,其他文件访问某个文件中的某个变量必须使用extern来引用声明(reference declaration)
  • thread_local(C++11新增)
  • mutable,用它来指出,即使结构(或类)变量为const,其某个成员也可以被修改。

CV-限定符:

  • const,它表明,内存被初始化后,程序便不能再对它进行修改

  • volatile(不常用),关键字 volatile 表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化

#include <stdio.h>
int g;	//全局变量,对应第四种存储方式
static int s_g = 5;		//对应第五种存储方式

const int fingers = 10;		//与static int finger = 10,一样其链接性表现为内部

extern const int f;	//引用声明其他文件的变量f


void fun()
{
    int i = 5;	//局部变量,对应第一种存储方式
    register int m = 0;	//对应第二种存储方式
    static int j = 0;	//静态局部变量,对应第三种存储方式
    ....
}

int main() { ... }

标签:存储,变量,int,C++,分布,static,内存
From: https://www.cnblogs.com/qianxiaohan/p/18174875

相关文章

  • 78. 子集-c++
    给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2:输入:nums=[0]输出:[[],[0]]classSolution{......
  • c++
    namespace命名空间我们为了防止由于定义了多个函数名,导致可能函数名重复的问题,我们创建了命名空间,为的就是区分函数名重复的问题当我们要调用某个命名空间中的函数时,我们可以直接namespace::function来进行直接调用,同时可以存放变量名,函数,再一个命令空间.....同时假如命名空间......
  • C++学习笔记
    参考https://github.com/weidongshan/cpp_projects《C++PrimerPlus》C++StandardsSupportinGCCGCCGCC中有libstdc++库的实现LLVMLLVM中有libc++库的实现面向对象编程的3大特点封装继承多态struct声明的类里的成员都是publicclass声明的类的成员都是pr......
  • c++综合实验报告友元
    综合性、设计性实验报告专业:计算机科学与技术 一、实验目的:1.熟练掌握友元函数和友元类设计的方法2.掌握友元函数的含义,友元函数和成员函数的区别。3.掌握友元类的含义。二、实验仪器或设备:微型计算机三、总体设计(设计原理、设计方案及流程等)实验内容:定义Student类和Sco......
  • 面试必问并发编程内存模型JMM与内存屏障剖析 学习
    总课程:1、JMM。每个线程会产生一个变量副本。如下图所示,第二个变量修改了变量initFlag,但线程1并不会退出,是因为每个线程产生了副本。----解决方法:volatileCPU缓存一致性协议:MESI机制,以及内存模型底层八大原子操作。Volatile缓存可见性实现原理:底层实现主要通过汇编lock前......
  • Jmeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决思路
    一、问题原因用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。概念补充:内存泄露:应用使用资源之后没有及时释放,导致应......
  • C++模板
    C++模板C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为Object的泛型基类,而是包含未指......
  • Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速
    一、前言最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。是否是文件也不能通......
  • C++ 抽象类快速使用
    在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化,即你不能创建这个类的对象。在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化......
  • C++ lambda的重载
    先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道)。而且即使代码完全一样的两个lambda也会有完全不同的类型。但虽然不能直接实现lambda重载,我们有办法去模拟。在介绍怎么模拟之前,我们先看看c++里的functor是怎么重载的。首先类的函数调用运算符是可以重载......