区分内存分配的方式

导言:

        在c++的世界里,“烫”和“屯”是我们遇到最多的两个汉字(限于vc用户)。为什么呢?

        答案:在vc里,栈空间未初始化的字符默认是-52,补码是0xCC。两个0xCC,即0xCCCC在GBK编码中就是“烫”;堆空间未初始化的字符默认是-51,两个-51在GBK编码中就是“屯”。二者都是未初始化的内存。

关于内存的分配方式:

        内存被分成了6个区:代码区,数据区(自由存储区,全局/静态存储区,常量存储区),堆取,栈区。除了代码区不是我们能在代码中直接控制的,其余都是都是我们编程中可以利用的。

      定义:

       栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,执行结束,存储单元自动释放。栈所分配的内容有限。

       堆区:堆就是那些由new分配的内存块,由我们的应用程序控制,一个new对应一个delete。如果程序员没有被释放掉,那么操作系统就会自动回收。

      堆和栈的区别:(六个方向)

  • 管理方式不同 : 栈由编译器自动管理,对于堆,它的释放得有程序员自己控制,容易产生memory leak.
  • 空间大小不同  :  堆内存几乎没啥内存限制,而栈是由一定的空间大小
  • 碎片问题         :  对于堆,频繁的new/delete,会造成内存空间的不连续,对于栈来说,不会出现这种情况,原因是栈是特殊的数据结构, 先进后出,相互之间紧密排列,绝不会给其他数据留下插入的空隙。
  • 生长方式        :堆的生长方式是向上的,也就是向这内存地址增加的方向增长,而栈正好相反
  • 分配方式         : 堆都是动态分配,没有静态分配。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数完成,但是栈的动态分配和堆的是不同的,它的动态分配是由编译器进行释放的,无须我们手动实现。
  • 分配效率         :栈是机器系统提供的数据结构,计算机底层会对栈提供支持:它分配专门的寄存器存放栈的地址,而且压栈和入栈都会有专门的指令来执行,这就决定了栈的效率比较高。

猜你喜欢

转载自blog.csdn.net/m0_37806112/article/details/80044679