程序由代码和数据组成。
程序运行占用的内存一般分为如下几种:
1、全局/静态数据区 // 全局变量、静态变量都放在一个区的。具体如何实现,还搞不清楚。 不论是普通的静态变量,还是类中的静态变量。
2、常量数据区
3、代码区
4、栈
5、堆
对象不一定是在堆中的,如果对象是通过函数中定义的某个变量,或者实现需要的临时变量来创建的,那么它是在栈上的,而不是在堆里面。
(呵呵,没想到在性能调优的书中,把这个概念明晰化了)
#include <stdio.h>
#include <stdlib.h>
int nGlobal = 100; // 在全局/静态数据区
int main()
{
char *pLocalString1 = "LocalString1"; // 放在常量数据区, pLocalString指向的是常量数据区,"LocalString1"对应的内存在常量数据区,但是 pLocalString1这个变量是在栈上的, 通过打印 &pLocalString1,可以看出。 字符串存放在常量数据区,而且是4个字节对齐的。
const int nLocalConst = 20; // 在常量数据区,不是的。 这个变量是存放在栈上的,只是这个变量不能修改。 如何做到的,加标记? 字符串才放在常量区域?
int *pNew = new int[5]; 通过new (malloc)获得的是堆上的内存,pNew指向了堆上的地址,*pNew[0]是指向堆上的一个内存单元。 而&pNew则是栈上变量的一个地址 // 堆上分配是按16字节对齐的。 这里分配的内存是20字节(实际应该占用32字节),如果再申请一个字节,会从32字节之后开始分配内存。 对齐的字节数可否自己定义,通过编译选项来完成吗?
}
C语言有静态变量,C++除此之外还可以定义 类的静态变量。 用于在类的对象之间共享数据。虽然也可以用全局变量做到这一点,但是会破坏类的封装性。 这也是类静态变量存在的理由,呵呵,每样设计都是基于一定的需求,而精心设计的啊。
虽然内存对齐会浪费一些内存,但是CPU在对齐方式下运行比较快,所以一般对程序性能还是有好处的。
编译时,会对成员变量进行对齐操作。 可以通过 #pragma pack() 设定对齐的字节数,或关闭对齐
内存泄露是 C/ C++非常需要注意的地方。 那么程序退出时,这些内存是否会被收回呢?
插入*pMalloc = (char*) malloc(1); 用malloc在堆上申请了 1个字节的内存,将获得的地址记录在变量pMalloc中。
malloc申请的内存需要用 free来释放, new申请的内存,则要用delete来释放。
栈不存在内存泄露问题。 那为什么还要用堆呢? 因为很多应用要动态地管理数据。如链表,要为链表增加节点,就无法使用栈上的对象。此外栈的大小有限制,占用内存较多的对象或数据只能分配在堆上。
堆的大小一般只受限于系统有效虚拟内存的大小。
栈的效率比较高,而且不会有碎片。
堆得效率要低些,并且会产生碎片。
posted on 2009-09-05 01:28
thinke365 阅读(230)
评论(0) 编辑 收藏 引用 所属分类:
性能优化