• 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一下,所有变量都出于未分配状态,就好像是一个没有分配目标内存地址的指针,肯定是不能使用的。

  • 相关阅读:
    怎样用c/c++编程连接mysql数据库?
    c#中转义符总结
    制作文件系统出错运行mkubimagemlc2
    面试中常考的C函数库中的字符串处理函数
    移动支付模式再添新军:指纹支付
    面试中常考的单链表处理
    选购冰箱勿被概念迷惑:并非功能越多越好
    地址转换
    JavaScriptGarden/
    配置非安装版的mysql 5.5
  • 原文地址:https://www.cnblogs.com/vanpan/p/3583046.html
Copyright © 2020-2023  润新知