当new一个类的时候,正常情况下不分配空间,但是vs编译器会为它分配一个4字节的指针。
在对它进行操作的时候通过指针找到类的地址,当你对类具体操作的时候,再具体分配空间

解决方案 »

  1.   

    yeness() 
    你是说c#的exe每一次运行都要先编译?
      

  2.   

    编译是生成.obj或者.dll文件
    编译性语言比解释性语言速度快---asp.net 比asp快(asp是解释性语言)这说的解释不是(html对语言的解释,是编译器解释)内存分配是在执行代码时候分配的。.net有两种内存分配,一种在堆上,一种在栈上以上是一己之言,不知道别的人有没有意见
      

  3.   

    另外.net在编译期间应该是为静态变量分配堆空间的,个人认为编译的时候是分配控件的。
    .net当中不需要显示的释放指针和类空间,是由CLR去完成的,所以变量命名的时候最好遵循一定的标准。
    我记得:CLR是由三个内存控件去控制的,如果这三个空间都满了,CLR会自己保留当前使用的类和变量,然后做一个正在使用的类还变量表,然后释放所有资源,然后找到刚才保留的表,去找到相关正在使用的资源重新分配空间
      

  4.   

    编译的时候分配栈内存,我的想法是const修饰的一些变量都会分配到栈内的
      

  5.   

    new 出来的东西分配在堆中
      

  6.   

    不太懂楼主的最终意思。简单数据类型也就是指编译器定义出来的类型,一般指int float bool double struct ...,如果你程序里写int i = 5; 那么变量 i 里面的 5 是放在栈里面的;如果你写了个
    A a = new A(); 那这个只有在运行的时候,会在堆中开辟a的对象实体。编译和执行 这两种情况对内存使用是有区别的。
      

  7.   

    yq_m(老缪),“不太懂楼主的最终意思。简单数据类型也就是指编译器定义出来的类型,一般指int float bool double struct ...,如果你程序里写int i = 5; 那么变量 i 里面的 5 是放在栈里面的;”我问的是i什么时候放到栈里的?是编译的时候?
      

  8.   

    c#当中没有全局的变量,编译的时候不能分配。
    c++当中可以在类外定义全局变量,编译的时候分配内存,程序运行关闭之前由idispose释放。
      

  9.   

    可执行文件在运行时代码被调入内存,这时候静态对象根据编译时分配的相对地址去分配内存,这些静态对象被分配的内存在一个连续的空间,这是编译时决定的,一次分配所有静态对象的内存,应该是为了速度吧,毕竟每个变量进行一次动态分配是很耗时间的。看看汇编和PE文件格式应该理解更容易些。
    像这样的东西:class A;A *a=new A;其实a是一个静态对象,指针嘛,new操作在运行期执行。
    虽然是07年的帖子,俺依然回了,希望对后来者有所帮助,如有错误,请发个信或帖子指正一下,谢了。
      

  10.   

    编译过程:是把源文件翻译成目标文件存到硬盘上,这个过程占不占内存没关系,是编译器做的事,目标文件由三个部分组成:1. 文件信息,包括文件类型,文件大小等等,如:DLL文件的前两个字节是0x4d 0x5a。2. 代码,就是程序,如 HData data = new HData(); HData是自己定义的类,这一句被转换成如下形式,共占37个字节。
    00000040 B9 10 7F DA 00   mov         ecx,0DA7F10h 
    00000045 E8 E2 4D D4 FB   call        FBD44E2C 
    0000004a 89 45 B4         mov         dword ptr [ebp-4Ch],eax 
    0000004d 8B 4D B4         mov         ecx,dword ptr [ebp-4Ch] 
    00000050 E8 0B F0 AB FB   call        FBABF060 
    00000055 8B 55 C4         mov         edx,dword ptr [ebp-3Ch] 
    00000058 8B 45 B4         mov         eax,dword ptr [ebp-4Ch] 
    0000005b 8D 92 84 01 00 00 lea         edx,[edx+00000184h] 
    00000061 E8 3A 5B FE 74   call        74FE5BA03. 数据,包括全局变量、静态变量和常量。类成员变量、方法局部变量不编译到文件中。如:static int a = 0; 在文件中占四个字节,int a = 1, 在文件中不占字节,string str = "12345", 虽然是类成员,但其中隐含常量“12345”,在文件中占5个字节 。
    运行过程:1. 双击图标时,系统把exe文件全部调入内存,主要包括所有程序和全局变量,这一部分内存一直被占用到退出程序。2. 运行程序,还以这一句为例,HData data = new HData(); HData类的程序已经在内存中,所有HData类的实例共用一套程序,系统只是为HData的数据(主要是HData中的变量)分配一块内存,并把这块内存的起点,静态变量除外,它在加载exe文件的时候调入内存。data 失效的时候,这一块内存被释放。
        局部变量,void aaaa(){ int a = 1; } 这段程序的主体部分大约占5个字节,a变量不占内存,调用aaaa()的时候执行一行汇编码 add bp, 4 就是在栈中分配四个字节给a,aaaa()返回的时候,a变量占用的四个字节被释放。3. 退出应该程序的时候释放exe文件占用的内存。以上只是一个大至的原理,实际情况要复杂的多,象分配的内存是可移动的,甚至会被放到内存中。不过咱们做应用程序的了解这些就足够了。再深入是的做系统和做编译器的人管的事。写完以后才发现是07年的帖子,哈,还是发了吧。