首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#基础知识-内存管理

C#基础知识-内存管理
EN

Stack Overflow用户
提问于 2009-11-22 03:41:56
回答 4查看 496关注 0票数 2

我对C#编程是个新手。

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

代码语言:javascript
复制
Class Student
{

     int Id;
     String Name;
     Double Marks;

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

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

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

那么方法呢?它们被分配到哪里?

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

有没有人能给我简单解释一下?

EN

回答 4

Stack Overflow用户

发布于 2009-11-22 03:47:04

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

  • 8字节的对象开销(同步块和类型指针)
  • 4字节用于int
  • 4字节用于字符串引用
  • 8字节用于double代码<

>F29>

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

方法不会招致与is字段相同的存储惩罚。从本质上讲,它们与类型相关联,而不是与类型的实例相关联,但是需要考虑IL版本和JIT编译的代码。然而,在我的经验中,通常你可以忽略这一点。你必须有大量的代码和很少的实例,才能使代码占用的内存与数据相比是显着的。重要的是,您不会为每个实例获得每个方法的单独副本。

编辑:请注意,您碰巧选择了一个相对简单的案例。在你有逻辑上较小的字段(例如shortbyte字段)的情况下,CLR选择如何在内存中布局对象,以便需要内存对齐的值(在字边界上)得到适当的布局,但可能会支持其他值-因此4字节的字段可能最终占用4个字节,或者如果CLR决定分别对齐每个字段,它们可能占用16个字节。我认为这是特定于实现的,但可能是CLI规范规定了所采取的确切方法。

票数 5
EN

Stack Overflow用户

发布于 2009-11-22 03:59:03

正如Jon Skeet所说,它取决于很多因素,而且不容易提前测量。诸如它是在64位操作系统上运行还是在32位操作系统上运行,以及您运行的是调试版本还是发布版本等因素都必须考虑在内。代码占用的内存量取决于抖动编译到的处理器,因为不同的处理器可以使用不同的优化。

票数 0
EN

Stack Overflow用户

发布于 2009-11-22 04:10:31

不是真的回答,只是为了好玩。

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
      Console.WriteLine(Marshal.SizeOf(typeof(Student)));

在64位返回时:

代码语言:javascript
复制
      24

在32位上:

代码语言:javascript
复制
      16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1776524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档