c++中的内存模型

上传人:第*** 文档编号:34615390 上传时间:2018-02-26 格式:DOCX 页数:3 大小:23.96KB
返回 下载 相关 举报
c++中的内存模型_第1页
第1页 / 共3页
c++中的内存模型_第2页
第2页 / 共3页
c++中的内存模型_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《c++中的内存模型》由会员分享,可在线阅读,更多相关《c++中的内存模型(3页珍藏版)》请在金锄头文库上搜索。

1、1. C+存储区域我们在程序开发中将 C+存储区域分为以下几步:1、栈区(stack) 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放4、文字常量区 常量字符串就是放在这里的。程序结束后由系统释放5、程序代码区存放函数体

2、的二进制代码。2.头文件中常包含的内容函数原型。使用#define 或 const定义的符号常量结构声明。类声明。模板声明。内联函数。3.头文件管理(防止重复包含)#ifndef COORDIN_H_#define COORDIN_H_/Place include file contents here#endif4.多个库的链接C+标准允许每个编译器设计人员以他认为合适的方式实现名称修饰,因此由不同编译器创建的二进制模块(对象代码文件)很可能无法正确链接。在编译链接模块式,请确保所有对象文件或库都是由同一个编译器生成的。5.存储连续性、作用域和链接性(1)存储连续性自动存储连续性:在函数定义中

3、声明的变量(包括函数参数)静态存储连续性:在函数定义外定义的变量和使用关键字 static定义的变量动态存储连续性:用 new操作符分配的内存,知道 delete操作符时释放。(2)作用域局部作用域:只在定义它的代码块中可用。auto,register。寄存器变量是另一种形式的自动变量。CPU 访问寄存器中值的速度比访问堆栈中内存快。如果变量被存在寄存器中(声明中只要使用了 register),则没有内存地址,不能将地址操作符用于寄存器变量。全局作用域(文件作用域):从定义位置到文件结尾之间都可用。在类中声明的成员的作用域为整个类。在名称空间中声明的变量的作用域为整个名称空间。函数的作用域是整

4、个类或整个名称空间(不能再代码块内定义函数)。(3)链接性内部链接性:只能由一个文件中的函数共享外部链接性:可在文件间共享6.静态变量静态变量有三种链接性:外部、内部、无。外部链接性:在代码块的外面声明(也称为全局变量)内部链接性:在代码块的外面声明,并使用 static限定符无链接性:在代码块内声明,并使用 static限定符如果文件定义了一个静态外部变量,其名称与另一个文件中声明的常规外部变量相同,则在该文件中,静态变量将隐藏常规外部变量。7.定义和声明定义声明(称为定义)和引用声明(称为声明)。仅当声明将为变量分配存储空间时(即定义声明),才能在声明中初始化变量。8.类的静态数据成员对于

5、非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。静态数据成员在没有产生类对象时其作用域就可见,即在没有产生类的实例时就可以操作它。静态数据成员和普通数据成员一样遵从 public,protected,private访问规则。静态成员变量要实际的分配空间,所以不能在类声明中定义。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。因此静态成员变量应该

6、在类中声明,格式为:static ElemType VarName;在使用该静态变量的 cpp文件中定义并初始化,格式为:ElemType ClassName:VarName=*;使用的格式为:ClassName:VarName9.类的静态成员函数普通的成员函数一般都隐含了一个 this指针,this 指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数 fn()实际上是 this-fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有 this指针。出现在类体外的函数定义不能指定关键字 static,sta

7、tic 是声明性关键字。静态成员函数可以继承和覆盖,但无法是虚函数(1) 静态成员函数只能访问静态数据成员和静态成员函数;(2) 非静态成员函数可以任意地访问静态成员函数和静态数据成员。10.const 变量const全局变量的链接性为内部的,如果出于某种原因希望某个常量的链接性是外部的,则可以使用 extern关键字来覆盖默认的内部链接性。extern const int states=10; (const变量定义时必须初始化)11.函数所有函数的存储持续性都自动为静态的,即在整个程序执行期间都一直存在。在默认情况下,函数的链接性为外部的,即可以在文件间共享。还可以使用关键字 static将

8、函数的链接性设置为内部的,使之只能在一个文件中使用。必须同时在原型和函数定义中使用该关键字。与变量一样,静态函数将覆盖外部定义。对于每一个非内联函数,程序中只能包含一个定义。对于链接性为外部的函数来说,只能有一个文件包含该函数的定义,但使用该函数的每个文件都应该包含其函数原型。12.内存动态分配动态内存由 new和 delete控制,而不是由作用域和链接性规则控制。因此因此可以在一个函数中分配动态内存,而在另一个函数中释放它。虽然存储方案概念不适用于动态内存,但是适用于用来跟踪动态内存的自动和静态指针变量。13.布局 new 操作符New操作符还有另一种变体,布局 new操作符。它让你能够指定要使用的位置。要包含头文件 new。struct s1; char buffer50;s1 *p1=new s1;s1 *p2=new (buffer) s1;delete只能用于这样的指针:指向常规 new操作符分配的堆内存。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号