我是C#编程的新手。
有谁能告诉我关于C#的内存管理?
Class Student
{
int Id;
String Name;
Double Marks;
public string getStudentName()
{
return this.Name;
}
public double getPersantage()
{
return this.Marks * 100 / 500;
}
}
我想知道为这个类的实例分配了多少内存?
方法怎么样?他们被分配的地方?
如果有静态方法,那么它们的存储呢?
有人可以向我简单解释一下吗?
答案 0 :(得分:5)
类本身的实例将在32位CLR上占用24个字节:
请注意,字符串本身的内存除此之外 - 例如,许多对象可以共享对同一字符串的引用。
方法不会导致相同类型的存储损失是字段。基本上它们与类型而不是类型的实例相关联,但是需要考虑IL版本和JIT编译的代码。但是,通常你可以根据我的经验忽略这一点。与数据相比,您必须拥有大量代码并且代码占用的内存很少。重要的是,您没有为每个实例获取每个方法的单独副本。
编辑:请注意,您碰巧选择了一个相对简单的案例。在你有大小逻辑较小的字段(例如short
或byte
字段)的情况下,CLR选择如何在内存中布置对象,以便需要内存对齐的值(在字边界)被适当地布局,但可能支持其他 - 因此4字节字段可能最终占用4个字节,或者如果CLR决定分别对齐每个字节,它们可以取16个字节。我认为是特定于实现的,但CLI规范可能会规定采取的确切方法。
答案 1 :(得分:0)
正如我想Jon Skeet所说,这取决于很多因素,并且不容易提前测量。必须考虑诸如是否在64位操作系统或32位操作系统上运行等因素,以及是否正在运行调试版或发布版。代码占用的内存量取决于JITTER编译的处理器,因为不同的优化可以用于不同的处理器。
答案 2 :(得分:0)
不是真的回答,只是为了好玩。
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位上:
16
答案 3 :(得分:0)
sizeof(getPersantage());
找出它的字节的好方法。没有太多的C#,但更好的答案而不是答案:=)