zoukankan      html  css  js  c++  java
  • windows下对于几种常见的内存的探讨

      首先,本文的环境是windowx xp , vs 2008 9.0 21022.8 TRM,inter,

      本文主要会讨论到堆,栈,常量,静态,全局等,具体的概念我也不知道如何定义了,本人也是菜鸟级别的,书看的少,有错误的地方,希望各位大虾指证

          1。首先来讨论栈

      先来个测试程序

    void test() {
     int a7 = 9;
    }

    int main()
    {
     int a1=1;
     {
     int a2=2;
     }

     int a3=3;
     for (int a4=4; true; ) {
      int a5 = 5;
      break;
     }

     int a6 = 4;
     test();
     int a8 = 6; 
     return 0;
    }

    开出我们的法宝内存查看器(调试-窗口-内存)和监视器(调试-窗口-监视)

    定个断点跟踪调试,在监视器中观察以上变量的地址,如

    从图中我们看出来了a1的地址是0x0012ff60,现在打开内存来看这个地址

    我们看到了0x0012FF60 01 00 00 00,我们该位置存放的是int, 代表的是以0x0012FF60 的是整型,在本人的机器上,是从高位读到底,具体的值就是0x00000001十进制就是1,例子举的不够好,假设 

    0x0012FF60 01 02 03 04 存放的是int,则(0x0012FF60)int=0x04030201  (0x0012FF60)char=0x01,大概就是这样,好了,到了这里我们可以看内存和监视变量

    继续以上程序当步跟踪,具体不截图了,大家观察发现啥没有,我来总结一下

    1.a1,a2,a3,a4,a5,a6内存是网低处分配的,0x0012FF60,0x0012ff54, 0x0012ff48, ..... 证明了栈是往低内存张的,在这里,我们这里暂时只讨论到这,至于张到啥个程度,今后有机会讨论(1)

    2.变量之间有8个字节,大家注意到没有如我们上图的02 00 00 00 cc cc cc cc cc cc cc cc 01 00 00 00 这中间加的这为什么呢?哦,我们是debug模式,当然是来校验栈是否被破坏啦,具体的我们有机会讨论(2)

    3.大家看代码,注意&a2,和&a3,这一点小菜我当时也预计错了,以为&a3会和&a2相同因为&a2已经没有用了嘛,可是事实说明在a2生存周期过后,栈顶指针是不变的,也就是说a2位置处还是原来a2的内容,除非当前函数退出,会产生叫做栈展开的当然会改变栈顶指针了,如果a2是一个类的化,析构肯定是会调用的。

    4.注意&a3, &a4, &a5, 其实这个规则也就是3所说的

    5.&a6, &a7, &a8就是一个栈展开的例子,假设a8后还有a9, a10.....,到一定的时候,会吧a8内容覆盖的

    6,当然了,栈空间是有限的,具体的限制范围,今后有机会讨论吧(3)

    好了,对栈的讨论我们就到这了

    累了,对于堆,下次有机会再讨论吧

  • 相关阅读:
    mvc页面中,显示自定义时间格式
    时间格式字符串中,大小写字母的解释
    subversion SVN global ignore pattern
    .net项目svn项目管理文件清单
    nopcommerce插件相关
    vs2013执行Add-Migration出现的问题
    jquery为多个元素添加事件
    在JavaScript中创建命名空间的几种写法
    Python 创建XML 的三种方式
    Python 对网页操作的方法, urllib ;requests
  • 原文地址:https://www.cnblogs.com/wenlove/p/1853169.html
Copyright © 2011-2022 走看看