c++内存分区大致分为代码区,常量区,全局数据区,堆区,栈区(也可以进行进一步分区,小编感觉没必要了解太多就不做进一步扩展了)
1、栈区(stack)(空间大小一般为2mb):由编译器自动分配释放,存放函数的参数值,局部变量值等。
int print_int_string(int s1, std::string s2) { //s1与s2形参就是局部变量 //int a; double b; 该函数里面定义的变量也是局部变量 printf("int : %d, string : %s", s1, s2); }2、堆区(heap)(空间大小一般为2G):一般由程序员分配释放,随叫随到,挥之即走。 new ; delete(不是数组) 指针变量(释放的内存地址) ;delete[] 指针变量(数组首个元素的地址)([]里面没有数值,是因为编译器在分配堆空间时已经做了登记) 使用堆区一定要小心,避免内存泄漏
(扩展堆空间使用注意事项,以及常见的函数) a.按需分配,根据需要分配内存,不浪费 b.被调用函数之外需要使用被调用函数内部的指针对应的地址空间 c.突破栈区的限制,可以给程序分配更多的内存 内存拷贝函数 void *memcpy(void *dest, const void *src, size_t n); #include<string.h> C 内存分配: void *malloc(size_t size); void free(void *); malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域 的首地址(malloc free使用时应该避免与对象的纠缠,c++的 new 和delete无论是功能还效率都更好)
3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。 全局/静态区定义基础变量或数组会被赋予一个初始值0 静态变量仅执行一次创建变量时的赋值
4、文字常量区:存放常量字符串 注意:当两个字符串常量的值相等时,只有一个字符串被放进文字常量区
const char *s1 = "11111111"; const char* s2 = "11111111"; printf("%p %p", s1, s2);通过以上代码,得要结果s1=s2,及验证了上述结论成立,c++这样做是为了减少不必要的内存浪费
5、程序代码区:存放函数体(包括类的成员函数、全局函数)的二进制代码 就是一些二进制指令,相当人的大脑,控制计算机运行对数据进行操做