内存分配解析

来源:互联网 发布:matlab等差数组 编辑:程序博客网 时间:2024/05/16 03:10

参考:http://topic.csdn.net/u/20100330/22/4b7ceb59-8f33-4a56-bd21-60444a1223b0.html?99992

http://blog.sina.com.cn/s/blog_5ece51450100gjoz.html

第一部分 C++内存地址分配简介

内存地址一般是从高地址到低地址进行分配的:  

int i=1;
int j=1;
cout<<&i<<endl<<&j<<endl;   //
输出:0012FF60(高地址处) 0012FF54(低地址处)

在栈上分配内存的变量:
栈底在高地址的机器,先声明的在高地址(这个是大多数)
栈底在低地址的机器,先声明的在低地址

在堆上分配内存的变量:
一般情况下,先声明的在低地址


自动变量放在栈区,栈是往低地址生长的,所以自动变量先声明的放在高地址区域。
(非static变量)


动态分配的内存的变量放在堆区,堆是往高地址生长的,所以动态分配的变量先声明的放在低地址区。
(用new分配的内存,或用函数malloc()分配的内存,或用calloc()分配的内存)

2 函数参数列表的存放方式是,先对最右边的形参分配地址,后对最左边的形参分配地址。

3 Little-endian模式的CPU对操作数的存放方式是从低字节到高字节的

0x1234的存放方式入下:

0X4000 0x34

0X4001 0x12

4 Big-endian模式的CPU对操作数的存放方式是从高字节到低字节的

0x1234的存放方式入下:

0x4000 0x12

0x4001 0x34

联合体union的存放顺序是所有成员都从低地址开始存放。

6 一个变量的地址是由它所占内存空间中的最低位地址表示的。

0X4000 0x34

0X4001 0x12

0x1234 的地址位0x4000

7 堆栈的分配方式是从高内存地址向低内存地址分配的。

int ivar=0;

int iarray[2]={11, 22};

注意iarray[2]越界使用,比如对其赋值

iarray[2]=0;

那么则同时对ivar赋值为0,可能产生死循环,因为它们的地址相同,即&ivar等于&iarray[2]

 

第二部分 C/C++内存区划分

 C中分为这几个存储区
1.
 由编译器自动分配释放;
2.
 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
3.
全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束释放;
4.
另外还有一个专门放常量的地方。 程序结束释放。
                                                                                                                                              
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如:

int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
     int b; //

     char s[] = "abc"; //

     char *p2; //

     char *p3 = "123456"; //123456{post.content}
在常量区,p3在栈上
     static int c = 0; //
全局(静态)初始化区
     p1 = (char *)malloc(10); //
分配得来得10字节的区域在堆区
     p2 = (char *)malloc(20); //
分配得来得20字节的区域在堆区
     strcpy(p1, "123456");
     //123456{post.content}
放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块
}
.C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
1.
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3.
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。