posts - 3,  comments - 0,  trackbacks - 0

程序由代码和数据组成。

程序运行占用的内存一般分为如下几种:
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 阅读(237) 评论(0)  编辑 收藏 引用 所属分类: 性能优化

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理