现在的位置: 首页 > 综合 > 正文

关于.NET的内存使用

2013年03月21日 ⁄ 综合 ⁄ 共 3496字 ⁄ 字号 评论关闭

   2010-05-28 09:55:56
你好
   15:47:50
你好
   15:48:58
请教你一个C#问题可以吗
   15:49:16
说吧,我知道我就告诉你。
   15:50:25
请教一下C#中静态构造函数在内存中是如何执行的,有的讲是在类载入内存时执行,请问类载入内存是指类载入代码区还是指载入数据区。请多多指教谢谢!!!
   15:54:32
静态的资源与实际动态的对象是存放在不同的内存中的,所有类的映射信息和静态信息,都是单独存放的。当访问一个类的静态成员时,如果有默认的静态构造函数,就会先进行调用。比如有个类为Class1,当访问Class1.MB的时候,如果从来未有调用过静态构造函数,就会先调用静态构造函数。再返回值。之后就不再调用静态构造函数了。
   15:57:16
就是类的信息(比如类的定义和类的实例成员)和类的静态信息是存在不同的空间里是吗
   15:57:36
载入内存,是属于.NET框架的设计部分。在运行期间,当一个要使用某个类的时候,会先将类的所有定义载入到内存中。也就是一个Type类型的对象。因为所有对象都可以被定义为某种Type类型的对象。所有的类、接口等都会以Type的形式存放在内存中。当初始化一个对象,如调用对象的构造函数时,就会根据对象对应的类型(Type),创建一个对象内存,将对象的数据存放于其中。
   15:58:05
类的信息,类的静态信息、对象信息,都是分开存放的。
   15:59:09
类的信息指什么
   15:59:33
类的信息是Type,类的静态信息是调用时进行动态检查的,如果某个类的静态信息从来没有访问过,在初次访问时就会调用静态构造函数来初始化类的静态信息内存地址。
   16:00:13
所有对象都是继承自Object,而所有Object都有一个Type。这个Type就是类的信息。
   16:00:54
Type是什么
   16:01:10
比如你是人,你是人的一个对象,人也有他自己的信息,如人有眼睛、耳朵、鼻子等等。
   16:01:37
   16:01:42
Type是类型的泛型,也就是所有类别的基类,用来统一描述所有的类别。
   16:02:26
比如有人类、动物类、植物类。这些都是类,Type就是对于这些类而定义的统一的基类,这样就可以统一描述所有的类型。
   16:02:42
在类内存中,就会统一为这些进行存储。
   16:03:12
当一个dll加载到内存的时候,dll中所有的类信息,就会被创建成一个个的Type存放于类内存中。
   16:03:39
我看视频教程那里讲内存大致分为代码区和数据区,类定义,成员定义就放到代码区而实例放在数据区
   16:04:11
差不多,有的会叫堆和栈。代码区就相当于类内存,数据区就相当于对象内存。
   16:05:39
嗯,所以我想请教一下静态构造函数执行时首先要载入内存,那么类是载入代码区还是载入数据区
   16:05:51
类是在代码区
   16:06:43
代码区相当于一个一级的缓存,先将类的信息缓存在其中,这样创建对象的时候,就不用每次都去创建一个类信息了。
   16:07:15
比如每次运行A对象可能会被创建几千次,而A类的信息,就只有一次。这样就大大的提高了内存使用效率。
   16:08:09
载入的意思是程序运行的时候类才会被在入袋代码区,而不是程序在编译的时候类就被载入到代码区是吗
   16:08:36
载入的意思是程序运行的时候类才会被载入代代码区,而不是程序在编译的时候类就被载入到代码区是吗
   16:08:38
类的信息中,记录的就是某个类需要使用多少内存一级各个内存大概的格式。这样再创建对象的时候,根据类的信息,就在数据内存中开辟一块属于这个类大小的内存。然后根据默认信息和构造函数对这块内存中各个地址的数据进行赋值。这样就创建了一个对象。
   16:09:55
如果是一个CS的程序,在运行exe程序时,会自动将他引用的所有dll都加在到内存中,这时所有的类都已经加在到了代码区。
   16:11:05
哦就是运行运行exe程序时才会载入类,而编译的时候不会载入类是吗
   16:11:09
如果是BS程序,那么是根据IIS的设置,首个访问地址的人会逐个的将所使用的dll或者页面加在到内存中,这个时候类信息也加在到了代码区。
   16:11:22
编译跟运行没关系
   16:12:26
编译,只是根据你的代码,将所有类打包成dll。他所在的内存是你VS的内存。而实际进行调试所运行的exe,他单独还有自己的内存。
   16:16:19
哈你说的挺详细的但是我是个初学者不太明白,我就简单得理解为编译时cs程序是放到另外的一个内存区但这时候类没有载入,而运行的时候也就是执行exe的时候是把类载入到代码区我这么理解对吗
   16:18:13
差不多
   16:18:43
这个要慢慢理解,不是一下子能明白的。我可能也说的不够准确。
   16:19:08
有时候你要拿一些日常的东西来做比喻,有助于提高理解。
   16:19:50
是不是只有运行exe文件的时候类才载入,而在编译的时候类没有载入
   16:20:44
载入的概念很复杂,你想了解哪些。
   16:21:31
编译期类也会被载入内存,但这是载入到VS内存中,与你写的程序没什么关系。
   16:23:41
今天我看C#视频教程听到静态构造函数执行的时候,必须是在类在于内存以后才执行,所以我就不理解了载入是什么时候算载入,并且不知到类载入到内存哪里(是载入到代码区还是载入到数据区
   16:24:25
你不应该把这个与编译关联起来
   16:25:25
那你说他这个视频说的载入是什么时候载入类的
   16:25:24
我想你应该去了解一下Windows运行的机制才行,不同的进程有单独的内存分配。
   16:26:39
在创建进程的时候,类信息就载入内存了。
   16:27:07
我还没有学到进程呢
   16:27:24
创建进程是什么时候
   16:27:31
那你也不需要抓住内存不放,这对你现阶段学习没什么帮助。
   16:28:20
运行某个应用程序的时候,一个应用程序的进程就创建了。一个进程代表一个应用程序。
   16:28:57
嗯谢谢你,但是我这个人心眼死又笨看到一个问题不会就爱问问明白不好意思,我昨天就想半天没有明白所以今天就到百度问问

   16:29:19
这种心态是对的,但是学编程,如果这样,会让你进度很慢的。
   16:29:54
那就是说载入是指运行exe文件的时候算载入了
   16:30:43
是的我都看好几年了可还是没有能力,但是我比较笨想学深的又怕学不
   16:30:46
你整体的思想还没掌握好,就对某个定义这样钻牛角尖,那么很可能耽误了你所能理解的东西的学习。学习的过程是循序渐进的,有时候可以糊涂一下。等第一轮学完了,再回头第二次看,或许当初不明白的东西就懂了。
   16:31:24
   16:31:19
这就是你太过注重细节了,束缚了其他东西的学习。
   16:31:27
难道你是处女座的?
   16:31:57
哈我是11月份的
   16:32:52
做编程,要循序渐进。先吧能懂的搞懂了,慢慢去肯那些不懂的。有时候在生活中你能找到编程的原型。
   16:33:15
刚刚你说编译的时候类也会载入内存,但是这时候创建进程了吗
这时,我在深思,我的回答虽然详细,却没能让一个初学者悟出点什么来。或许我自己也根本没悟出什么!

抱歉!评论已关闭.