zoukankan      html  css  js  c++  java
  • VC++ 内存机理的个人理解(二)——堆和栈

         说完了地址和指针,我们来说说堆和栈的不同,在此之前,感谢Polaris给我的帮助,在这个问题是他给我讲了很多,也举了很多例子,让我懂了很多关于堆栈的东西。

        首先,关于堆和栈的数据结构小凡就不多说什么了,是先进先出还是后进先出也不是我们讨论的范围。

        但是有一点还是很不一样的,栈内存空间一般而言要比堆内存空间小很多,对windows来说,一个thread的栈内存是1M,但是堆内存可以按照你的需要申请甚至好几个G(当然到时候要用硬盘缓存这个就是题外话了)。

        从编码上看,也是有一些区别的。

        在以上的代码中,intInStack就是存放在栈内存中的0,而intInHeap就是一个指向堆内存中的0的指针。没错,这就是C++分配堆内存和栈内存在代码上的区别,对C++来说,不管是值类型还是引用类型,都是通过这样的方式来申请堆内存和栈内存。而且,有一点更重要:堆内存是需要自维护的!delete intInHeap;如果不写,那这块内存就永远不释放,甚至程序关闭了也不会释放,这就是有名的内存溢出问题。

       

        题外话,C#中的堆栈内存分配方式:

        C#中,除了class以外,其它类型其实都是值类型,包括struct。小凡想很多人都认为new的就是分配在堆内存上了,事实上:

    int i = 0;
    int i2 = new int();

    int i3 = new Int32();

        这三行代码是等价的,它们都是值类型,所以,并不是C#中的new就保证在堆内存上。

        其实很简单,C#中是通过class声明的变量,就是引用类型,引用类型一律放在堆内存中。其它类型都是值类型,一律放在栈内存中

        什么?你问Int32?仔细看看,它是struct,你试试继承Int32看看就知道了。为什么要new?因为如果不new一下,所有变量都出于未分配状态,就好像是一个没有分配目标内存地址的指针,肯定是不能使用的。

  • 相关阅读:
    D3.js 几种常用的坐标轴
    前端页面的用户体验优化设计
    用can-fixture拦截Ajax并模拟响应
    webpack入门及使用
    CommonJS和AMD规范
    凝思6.0虚拟机搭建--遇到的问题
    凝思6.0安装vmware tools记录
    linux定时任务crontab命令
    find命令使用指南
    关于字体、字形、字符集、字体大小
  • 原文地址:https://www.cnblogs.com/vanpan/p/3583046.html
Copyright © 2011-2022 走看看