内存空间分析(整理收集)

转载 2013年12月02日 23:22:48
一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收  用new产生的对象放在堆中
3全局变量区(静态区)放在数据段,全局变量和静态变量的存储是放在一块的,初始化的全局变量
和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块
区域。 - 程序结束释放
4代码区。 - 函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。

变量可以分为全局变量、静态全局变量、静态局部变量和局部变量
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
 
 
静态变量可以实现多个函数和文件共享,而其值还不改变只需在头文件里定义static CString url or static ...之类的就行了
静态变量和全局变量是两码事
静态变量相对于自动变量,之所以称为静态变量,是说静态变量不随着程序作用域的改变而销毁。但是静态变量的访问受到作用域的制约。
自动变量是在函数调用栈中分配的,因此随着函数的退出,自动变量不能继续保存原来的值。
  而静态变量是在堆中分配的,编译器会对静态变量进行初始化,并且静态变量在整个程序中只有一个,而不像自动变量那样,会根据函数调用的不同具有多个副本。静态变量的值在函数退出后不变。
  全局变量是指变量的作用域范围是全局可见。而变量作用域决定于变量生命的位置。就是说在所有花括号之外声明的变量即是全局变量
 
 

在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函
数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不
管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文
件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内
有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{

int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区

p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456
"优化成一块。
}

还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组
和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中
所有的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏
。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态
内存时是寻找匹配的内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。

一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。

相关文章推荐

内存空间分几部分:代码段、数据段,栈,堆 (收集整理)

1.函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内...

内存空间分几部分:代码段、数据段,栈,堆 (收集整理)

1.函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内...

内存空间分几部分:代码段、数据段,栈,堆 (收集整理)

1.函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内...

C++中类的内存空间大小(sizeof)分析

在C语言中存在关于结构体的存储空间大小是比较深入的话题,其中涉及计算机的基本原理、操作系统等。我认为对齐是C语言中让很多初学者都拿不准摸不透的问题,特别是在跨平台的情况下,对齐这种问题更加的复杂多变,...

四个月的蜕变之类占用内存空间的分析

刚刚写了对于面向对象思想的理解,回家后想起来今天还有一个很重要的东西没有写,就是对类占用内存空间的分析,之前博客记载了对数组占用内存空间的分析,今天又学习了类在内存中的占用情况。 可能是因为...

C++中类的内存空间大小(sizeof)分析

那么在C++中的类的内存空间大小又有哪些特殊的问题呢?     首先,我认为对齐肯定也是其中的问题之一,对齐主要是为了加快读取的速度。     关于对齐这个我认为基本上已经是操作系统内定好...

03-Java基础(数组-内存空间的划分

  • 2016年04月26日 13:43
  • 3.73MB
  • 下载

Linux内存占用分析 进程内存空间

经常使用top命令了解进程信息,其中包括内存方面的信息。命令top帮助文档是这么解释各个字段的。 VIRT , Virtual Image (kb) RES, Resident size (kb)...

centos7配置swap交换内存空间

  • 2017年11月08日 11:45
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存空间分析(整理收集)
举报原因:
原因补充:

(最多只允许输入30个字)