C#基础知识 - 内存管理

时间:2009-11-21 19:41:56

标签: c#

我是C#编程的新手。

有谁能告诉我关于C#的内存管理?

Class Student
{

     int Id;
     String Name;
     Double Marks;

     public string getStudentName()
     {
         return this.Name;
     } 

     public double getPersantage()
     {
         return this.Marks * 100 / 500;
     } 
}

我想知道为这个类的实例分配了多少内存?

方法怎么样?他们被分配的地方?

如果有静态方法,那么它们的存储呢?

有人可以向我简单解释一下吗?

4 个答案:

答案 0 :(得分:5)

类本身的实例将在32位CLR上占用24个字节:

  • 8字节的对象开销(同步块和类型指针)
  • int
  • 的4个字节
  • 字符串引用的4个字节
  • 双重
  • 的8个字节

请注意,字符串本身的内存除此之外 - 例如,许多对象可以共享对同一字符串的引用。

方法不会导致相同类型的存储损失是字段。基本上它们与类型而不是类型的实例相关联,但是需要考虑IL版本和JIT编译的代码。但是,通常你可以根据我的经验忽略这一点。与数据相比,您必须拥有大量代码并且代码占用的内存很少。重要的是,您没有为每个实例获取每个方法的单独副本。

编辑:请注意,您碰巧选择了一个相对简单的案例。在你有大小逻辑较小的字段(例如shortbyte字段)的情况下,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#,但更好的答案而不是答案:=)