C++内存分布

news/2024/10/8 10:53:56

内存分布

典型的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;	//引用声明其他文件的变量fvoid fun()
{int i = 5;	//局部变量,对应第一种存储方式register int m = 0;	//对应第二种存储方式static int j = 0;	//静态局部变量,对应第三种存储方式....
}int main() { ... }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/28102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

如何用Python开发一个命令行工具

如何编写一个python命令行工具import argparsedef parse_args():parser = argparse.ArgumentParser()parser.add_argument("-nc", "--test_a", type=int, default=10, help="test A")parser.add_argument("-tp", "--test_b"…

[UE 虚幻插件 DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据库说明

本插件主要是支持在UE蓝图中连接和操作PostgreSQL 数据库。下载连接在文章最后。数据库连接 【 Create Postgre SQL 】输入:Host:数据库IP地址。Port: 数据库开放端口。User: 数据库用户名。Password:数据库密码。DBName:指定连接的数据库库名。输出:Success:返回数据库是…

endnote引用不成功,不显示1,2,3,引用却是字母

https://blog.csdn.net/kellyroslyn/article/details/113943394

基于WOA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

1.算法运行效果图预览 优化前:优化后: 2.算法运行软件版本 matlab2022a3.算法理论概述时间序列回归预测是数据分析的重要领域,旨在根据历史数据预测未来时刻的数值。近年来,深度学习模型如卷积神经网络(Convolutional Neural Network, CNN)、长短时记忆网络(Long Short…

胜诉退费 All In One

胜诉退费 All In One 2007年4月1日起施行的《诉讼费用交纳办法》第53条规定:案件审结后,人民法院应当将诉讼费用的详细清单和当事人应当负担的数额书面通知当事人,同时在判决书、裁定书或者调解书中写明当事人各方应当负担的数额。需要向当事人退还诉讼费用的,人民法院应当…

Git——分支管理(2)

Git——分支管理(2) 提示:图床在国外且动图比较多的情况下,需要时间加载。 目录: 目录Git——分支管理(2)提示:图床在国外且动图比较多的情况下,需要时间加载。目录:Git基础Git的分支与HEADGit的存储机制Git的分支指针Git的远程仓库Git的远程分支管理远程分支和本地仓…

super self

在一本过时的django里看到一段代码: class PublishedManager(models.Manager):def get_queryset(self): return super(PublishedManager, self).get_queryset().filter(status=published)心想这写的这是啥啊,难道是递归?太复杂了! 认真学习之后才知道,super有两个参数,第…