c++内存模型------计算机系统核心概念及软硬件实现
c++编程语言有3中不同类项的变量:全局变量、局部变量和动态分配变量。变量的值存储在计算机的内存中,但是变量存储的方式取决于变量的类项。3种类型的变量分别对应存储器中3个特定的区域:
- 全局变量存放在存储器中的固定位置。
- 局部变量存放在运行时栈上。
- 动态分配变量存放在堆上。
全局变量的声明在所有函数的外面,在程序的执行过程中位置保持不变。局部变量在函数中声明,函数被调用时它们出现,函数结束时他们消失。动态分配变量随着new运算符的执行出现,随着delete运算符的执行消失。
栈是一个值的容器,通过压入(push)操作存入值,通过弹出(pop)操作取出值。存入和取出值的原则都是后进先出(弹出最后一个压入的值),所以有时候栈被称为LIFO表,Last In ,First Out
每条执行的c++语句是一个函数的一部分。c++函数有一个返回类型、一个名字和一个参数表。程序包括一个名为main的特殊函数。通过执行main函数中的语句来执行程序。main函数中的语句有可能掉用另一个函数。当执行一个函数时,按照如下顺序对运行时栈的空间进行分配:(在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。)
- 压入返回值的存储空间。
- 压入参数。
- 压入返回地址。
- 压入局部变量的存储空间。(函数静态变量是在静态存储区的,不入栈)
当函数结束时,按照相反的顺序释放运行时栈的存储空间
- 释放局部变量。
- 弹出返回地址,根据返回地址确定要执行的下一条语句。
- 释放参数。
- 弹出返回值,按照调用语句指定方式进行使用。
不管一个函数是main函数,还是在另一个函数中被一条语句调用的函数,都会执行这些步骤。
转载请注明出处:http://www.cnblogs.com/goudanli/p/7700536.html
计算机系统核心概念及软硬件实现
c++内存模型------计算机系统核心概念及软硬件实现的更多相关文章
- 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
- volatile关键字解析&内存模型&并发编程中三概念
原文链接: http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java5之前,它是一个 ...
- Java并发编程(二):JAVA内存模型与同步规则
一.Java内存模型(JMM) 它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.一个线程如何和何时能看到其他线程共享变量的值,以及在 ...
- 并发与高并发(二)-JAVA内存模型
一.java内存模型(JMM)-同步操作与规则 它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.一个线程如何和何时能看到其他线程共享 ...
- Java内存模型与线程安全
原文链接:blog.edreamoon.com Java内存模型 计算机cpu的运算能力强大,但是数据的存储相对于cpu运算能力需要消耗大量时间,为了充分利用运算能力引入了缓存,但是也为计算机系统带来 ...
- (转)JavaScript内存模型
JavaScript对象内存模型 转自:http://blog.csdn.net/u010425776/article/details/53617292 推荐-JavaScript作用域链内存模型: ...
- 【Java并发系列】--Java内存模型
Java内存模型 1 基本概念 程序:代码,完成某一个任务的代码序列(静态概念) 进程:程序在某些数据上的一次运行(动态) 线程:一个进程有一个或多个线程组成(占有资源的独立单元) 2 JVM与线程 ...
- 深入浅出Java内存模型
面试官:我记得上一次已经问过了为什么要有Java内存模型 面试官:我记得你的最终答案是:Java为了屏蔽硬件和操作系统访问内存的各种差异,提出了「Java内存模型」的规范,保证了Java程序在各种平台 ...
- 高并发第二弹:并发概念及内存模型(JMM)
高并发第二弹:并发概念及内存模型(JMM) 感谢 : 深入Java内存模型 http://www.importnew.com/10589.html, cpu缓存一致性 https://www.cnbl ...
随机推荐
- Linux学习笔记 -- yum 使用
yum是什么 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 她基于RPM包管理,能够从指定的服务器 ...
- C# 通用类型转换方法
在程序开发过程中经常需要进行数据的类型转换,而且如果一个字段的类型改成另一个类型时,所有相关的类型转换的地方都要跟着修改,不但造成了很多重复转换的代码而且修改字段类型时额外修改相关转换代码的工作量也很 ...
- Cocos2D中的内部函数
virtual bool isVisible(); // 是否可见 virtual void setVisible(bool visible); // 设置是否可见 boo ...
- springboot成神之——swagger文档自动生成工具
本文讲解如何在spring-boot中使用swagger文档自动生成工具 目录结构 说明 依赖 SwaggerConfig 开启api界面 JSR 303注释信息 Swagger核心注释 User T ...
- openark对MySQL进行Online_DDL
1.用oak对表sbtest1做添加字段和增加索引的Online DDL openark kit 提供一组小程序,用来帮助日常的 MySQL 维护任务,可代替繁杂的手工操作. 包括: oak-appl ...
- iis7+的虚拟目录:未能加载程序集“**”。请确保在访问该页之前已经编译了此程序集
在使用win8系统后,突然想运行iis,于是在windows组件中启用iis,并aspnet_regiis.exe -i注册iis后,于是开始发布了一个站点,一切正常 继而,在该站点下添加虚拟目录,然 ...
- 19-EasyNetQ:用EasyNetQ.Hosepipe重新提交错误信息
EasyNetQ.Hosepipe是EasyNetQ队列管理工具.用来取回队列中的消息并重新发布这些消息.还可以用它来检测错误队列,并重试发布消息. 用法 EasyNetQ.Hosepipe.exe ...
- java Integer类的缓存(转)
首先看一段代码(使用JDK 5),如下: public class Hello { public static void main(String[] args) { int a = 1000, b = ...
- Timer定时函数的用法
- C#中的IEnumerator、foreach、yield
[C#中的IEnumerator.foreach.yield] 1.IEnumerator,是一个接口,它的方法如下: 2.foreach语句,在编译后会变成IEnumerator的调用: 3.yie ...