C/C++ 堆 栈 静态 常量 代码 区 static关键字

C++五种内存分区

  • 堆:使用new函数分配的内存块,使用应用程序控制,而不是编译器。每一个new对应一个delete。如果程序未回收变量,将会有操作系统自动回收。
  • 栈(堆栈):使用编译器分配,并且自动清除。例如局部变量、函数参数。
  • 自由储存区:使用malloc分配内存,使用free释放内存。和堆相似。
  • 静态(全局):存放全局变量和静态变量
  • 常量:存放常量

堆 栈区别

  • 举例int* p=new int[5];指针p保存在栈区,数组由new函数申请,而保存在堆区,指针p指向这一段内存。
  • 管理方式不同,栈由编译器自动管理,堆由程序中newdelete函数管理,容易内存泄漏。
  • 空间大小不同,堆所占内存较大
  • 产生碎片,栈的数据结构紧密,一般不会产生碎片,堆会产生碎片。
  • 空间大小:堆的内存较大。
  • 生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向。对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
  • 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系 统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就 有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

static关键字控制变量储存方式

  • static关键字意义,使类中的一个变量为所有的类服务,而不是某一个对象。不破坏类的封装性,并且隐藏在类内部。
  • 优势:节省内存,同类共享。
  • 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
  • 不能将静态成员函数定义为虚函数。
  • 初始化只执行一次。

参考资料

  • C/C++堆、栈及静态数据区详解
  • 什么是代码区、常量区、静态区(全局区)、堆区、栈区?
  • 动态存储区、静态存储区、堆和栈的区别

你可能感兴趣的:(C/C++ 堆 栈 静态 常量 代码 区 static关键字)