C++内存理解

关于电脑存储的简单理解

电脑存储器都是以二进制位作为基本单位,电脑拥有即时任务的临时存储器,以及可以长期记忆的永久存储器。
当运行程序时,操作系统会在临时存储器分配空间来执行程序里的指令,如输入一个数字,CPU会从存储器中的某一位置(放置数字的二进制)拿到数字的二进制,CPU可以对其进行修改等(指令也在存储器中)。
存储器交给cpu数据二进制的过程,可以简单理解为内存的延迟。
程序指令要快速被处理,所以临时存储器所有位置可以任意次序被CPU接收并存取,这就是随机存取存储器(RAM)

c++内存布局

在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区

(1)栈(Stack):位于函数内的局部变量(包括函数实参),由编译器负责分配释放,函数结束,栈变量失效。

(2)堆(Heap):由程序员用malloc分配,free释放。如果程序员忘记free了,则会造成内存泄露,程序结束时该片内存会由OS回收。
(3)全局区/静态区(Global Static Area): 全局变量和静态变量存放区,程序一经编译好,该区域便存在 。并且在C语言中初始化的全局变量和静态变量和未初始化的放在相邻的两个区域(在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分了)。由于全局变量一直占据内存空间且不易维护,建议少用,程序结束时释放。
(4)常量存储区: 存储不能修改的常量。
(5)自由存储区:new所申请的内存,下面会探讨与堆的区别。

讨论:自由存储区和堆到底有什么区别?

翻阅一些博客、笔记发现很多人都把两者混淆,看到一种比较认可的说法是new的内存就是自由存储区,所以在堆上new就意味着此时自由存储区是堆。
从定义上区分,堆是C语言的术语,是OS维护的一块特殊内存,当调用malloc()时就会从中分配,稍后调用free可把内存交还。自由存储区是C++提出的抽象概念,通过new来申请的内存区域可称为自由存储区。c++编译器是默认使用堆来实现自由存储,也可以使用从爱国在操作符改用其它内存。

讨论:堆和栈
根据一些博主理解,总结到的从原因上,二者具体区别在于
栈内的变量是调用堆栈分配变量,因为堆栈有FILO的特性,所以才使得分配和释放的次序相反。
而堆上的变量因为分配和释放次序没有限制,所以不使用堆栈这个数据结构,而是自由链表等。

”总的来说不是所有的对象的生命周期都满足先进后出的。“

讨论:全局变量,静态局部变量,静态全局变量
从作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件。其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量;
静态局部变量,,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在。
静态全局变量,,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。
从分配内存空间,全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
全局变量作用场景:作用域是整个源程序;

静态局部变量作用场景:局限于一个源文件内,只能为该源文件内的函数公用
 A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
  B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值