不太懂楼主的最终意思。简单数据类型也就是指编译器定义出来的类型,一般指int float bool double struct ...,如果你程序里写int i = 5; 那么变量 i 里面的 5 是放在栈里面的;如果你写了个 A a = new A(); 那这个只有在运行的时候,会在堆中开辟a的对象实体。编译和执行 这两种情况对内存使用是有区别的。
yq_m(老缪),“不太懂楼主的最终意思。简单数据类型也就是指编译器定义出来的类型,一般指int float bool double struct ...,如果你程序里写int i = 5; 那么变量 i 里面的 5 是放在栈里面的;”我问的是i什么时候放到栈里的?是编译的时候?
你是说c#的exe每一次运行都要先编译?
编译性语言比解释性语言速度快---asp.net 比asp快(asp是解释性语言)这说的解释不是(html对语言的解释,是编译器解释)内存分配是在执行代码时候分配的。.net有两种内存分配,一种在堆上,一种在栈上以上是一己之言,不知道别的人有没有意见
.net当中不需要显示的释放指针和类空间,是由CLR去完成的,所以变量命名的时候最好遵循一定的标准。
我记得:CLR是由三个内存控件去控制的,如果这三个空间都满了,CLR会自己保留当前使用的类和变量,然后做一个正在使用的类还变量表,然后释放所有资源,然后找到刚才保留的表,去找到相关正在使用的资源重新分配空间
A a = new A(); 那这个只有在运行的时候,会在堆中开辟a的对象实体。编译和执行 这两种情况对内存使用是有区别的。
c++当中可以在类外定义全局变量,编译的时候分配内存,程序运行关闭之前由idispose释放。
像这样的东西:class A;A *a=new A;其实a是一个静态对象,指针嘛,new操作在运行期执行。
虽然是07年的帖子,俺依然回了,希望对后来者有所帮助,如有错误,请发个信或帖子指正一下,谢了。
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年的帖子,哈,还是发了吧。