《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
- 《C++应用程序性能优化》之程序内存
- 程序性能优化之 内存分配影响
- [C++应用程序性能优化]程序使用内存区
- 《C++应用程序性能优化》之对象及其内存(一)
- C程序优化之路--内存篇
- C\C++应用程序性能优化
- C++应用程序优化—读书笔记之《程序使用内存区》
- c程序性能优化
- C 程序性能优化
- java程序性能优化之找出内存溢出元凶
- Java程序性能优化之找出内存溢出元凶
- Java程序性能优化之找出内存溢出元凶
- Java程序性能优化之找出内存溢出元凶
- Java程序性能优化之找出内存溢出元凶
- Java程序性能优化之找出内存溢出元凶
- java程序性能优化之找出内存溢出元凶
- C++应用程序性能优化(书)内存管理
- [转]C++ 应用程序性能优化----内存池
- matlab加随机噪音
- AS安装后不能启动,启动时报错
- IBatis(1)——总体概述
- MySql数据库的操作
- Python内置函数学习(6)-bool(x)
- 《C++应用程序性能优化》之程序内存
- 【CodeForces 118D】【DP】 Caesar's Legions 【n1种步兵n2种马兵,询问多少种排列方式使不超过k1种步兵相连k2种马兵相连】
- #include <sys/socket.h>找不到头文件
- ”360宣布停止个人云盘服务“回顾360的发展历程
- Android对话框-AlertDialog
- ACM文件读入debug
- linux网络编程之socket(五):tcp流协议产生的粘包问题和解决方案
- 基于地图的短信追踪小练习(5)对话框之item的添加
- MySQL语法复习--储存过程与储存函数