《C++应用程序性能优化》之程序内存

来源:互联网 发布:mac程序删除 编辑:程序博客网 时间:2024/05/17 19:16

1、程序内存分类

       一个程序占用的内存区通常分5种,如下:

                 全局/静态数据区:储存全局变量和静态变量

                 常量数据区:储存程序中的常量、字符串等,不可修改

                 代码区:储存代码数据

                 :储存自动变量、局部变量,传递参数

                 :用户控制的储存区,储存动态产生的数据

2、内存对齐(戳此标题前往百度百科)

       程序在分配内存时为了加快访问速度,采取的一种分配策略。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”(摘自百度百科)。

对齐规则:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

3、堆与栈的区别

       栈上的内存由程序自行管理(即自动分配,自动销毁),所以不存在内存泄漏问题;而堆上的内存则是由开发人员进行处理。通过new/malloc申请的内存是堆上的内存,因此需要使用指针记录内存的位置,但需要注意的是这个指针本身却是存储在栈上内存中的,因此程序结束时,指针内存被自动释放,但是指针指向的堆上的内存未被释放,于是就产生了内存泄漏,因此,在程序结束前必须使用delete/free释放堆上的内存。
       除此之外,对于一个程序而言,一般来说,栈的大小是固定的,由编译器决定,通常栈不大。在VS中可以通过项目属性->配置属性->系统->堆栈保留大小,设置栈大小,如图。


         另外一个显著区别是效率,栈内存由系统分配,有特定的压栈、出栈指令,操作在栈顶进行,比较快,同时由于栈的规则是先进后出,比较符合变量作用域或者说生存期的特点,(作用域层层递进时,就是作用域内变量的一次次压栈)。而堆内存由开发人员自主申请,系统分配内存时需要根据特定的算法对内存区进行检索,找到合适大小的内存块,然后返回其地址,效率比栈低且易产生碎片。

0 0
原创粉丝点击