我对C#编程是个新手。
谁能告诉我关于C#的内存管理?
Class Student
{
int Id;
String Name;
Double Marks;
public string getStudentName()
{
return this.Name;
}
public double getPersantage()
{
return this.Marks * 100 / 500;
}
}我想知道为这个类的实例分配了多少内存?
那么方法呢?它们被分配到哪里?
如果有静态方法,那么它们的存储又如何呢?
有没有人能给我简单解释一下?
发布于 2009-11-22 03:47:04
在32位CLR上,类本身的实例将占用24个字节:
>F29>
请注意,字符串本身的内存是另外的-但例如,许多对象可以共享对同一字符串的引用。
方法不会招致与is字段相同的存储惩罚。从本质上讲,它们与类型相关联,而不是与类型的实例相关联,但是需要考虑IL版本和JIT编译的代码。然而,在我的经验中,通常你可以忽略这一点。你必须有大量的代码和很少的实例,才能使代码占用的内存与数据相比是显着的。重要的是,您不会为每个实例获得每个方法的单独副本。
编辑:请注意,您碰巧选择了一个相对简单的案例。在你有逻辑上较小的字段(例如short或byte字段)的情况下,CLR选择如何在内存中布局对象,以便需要内存对齐的值(在字边界上)得到适当的布局,但可能会支持其他值-因此4字节的字段可能最终占用4个字节,或者如果CLR决定分别对齐每个字段,它们可能占用16个字节。我认为这是特定于实现的,但可能是CLI规范规定了所采取的确切方法。
发布于 2009-11-22 03:59:03
正如Jon Skeet所说,它取决于很多因素,而且不容易提前测量。诸如它是在64位操作系统上运行还是在32位操作系统上运行,以及您运行的是调试版本还是发布版本等因素都必须考虑在内。代码占用的内存量取决于抖动编译到的处理器,因为不同的处理器可以使用不同的优化。
发布于 2009-11-22 04:10:31
不是真的回答,只是为了好玩。
struct Student
{
int Id;
[MarshalAs(UnmanagedType.LPStr)]
String Name;
Double Marks;
public string getStudentName()
{
return this.Name;
}
public double getPersantage()
{
return this.Marks * 100 / 500;
}
}和
Console.WriteLine(Marshal.SizeOf(typeof(Student)));在64位返回时:
24在32位上:
16https://stackoverflow.com/questions/1776524
复制相似问题