>백엔드 개발 >C#.Net 튜토리얼 >C# 기본 메모리 할당

C# 기본 메모리 할당

黄舟
黄舟원래의
2017-02-07 15:52:161761검색

1. 객체 생성


객체 생성 과정은 크게 메모리 할당과 초기화 두 부분으로 나누어집니다. .NET에서 CLR이 관리하는 메모리 영역은 주로 스택, GC 힙, LOH 힙의 세 부분으로 구성됩니다. 스택은 주로 값 유형 데이터를 할당하는 데 사용됩니다. 관리는 GC 힙과 같은 GC가 아닌 시스템에 의해 제어됩니다. 스레드가 값 유형 인스턴스의 메서드 실행을 마치면 이 공간이 자동으로 해제됩니다. 일반적으로 스택은 실행 효율성이 높지만 용량이 제한됩니다.

GC 힙은 작은 객체 인스턴스를 할당하는 데 사용되며 메모리 할당 및 재활용을 위해 GC에 의해 완전히 제어됩니다. LOH 힙은 대형 개체 인스턴스용으로 준비되어 있으며 압축되지 않으며 GC가 완전히 재활용될 때만 재활용됩니다. IL에서는 newobj, ldstr(문자열 객체 생성), newarr(새 배열 객체 할당에 사용), box(박싱) 등과 같은 객체 생성에 대한 일반적인 지침을 볼 수 있습니다.

물론 힙에도 값 유형이 존재합니다. 예를 들어 값 유형이 클래스의 필드로 사용되면 힙의 인스턴스 객체 공간에 저장되며, 박싱할 때는 값 유형은 힙에도 존재합니다. 이제 객체 생성 시 메모리 할당을 살펴보겠습니다. 이제 Person 클래스와 Student 클래스가 있습니다. 그런 다음 Student s = new Student() { StudentId = 2, Id = 4 }; 실행 후 s 객체가 생성됩니다. 아래에는 객체 생성 시 메모리 할당을 설명하기 위한 그림이 그려져 있습니다. 내가 그리지 않은 동기화된 인덱스 블록과 유형 개체 포인터가 있습니다.

public class Person
    {
        public int Id;
        public void Eat()
        {
            Console.WriteLine("Eat Pear");
        }
    }
 
    public class Student:Person
    {
        public int studentId;
        public void GotoSchool()
        {
            Console.WriteLine("Go to School");
        }
    }

코드 보기

C# 기본 메모리 할당


2. 상위 클래스 객체는 하위 클래스를 가리킵니다.

우리는 프로그램에서 다형성을 달성하기 위해 일반적으로 상위 클래스 객체는 하위 클래스를 가리키는 데 사용됩니다. 그런 다음 Person p=new Student();를 작성하면 힙에 하위 클래스 객체가 생성됩니다. 다음은 하위 클래스를 가리키는 상위 클래스 객체의 메모리 할당 다이어그램입니다. Person에 가상 메서드와 추상 메서드를 추가하고 Student 하위 클래스에 재정의된 메서드를 추가했습니다.

그림에서 볼 수 있듯이 하위 클래스가 상위 클래스의 가상 메서드 또는 추상 메서드를 재정의하면 Person 메서드 테이블의 두 메서드가 하위 클래스에 의해 재정의되고 다형성 기반 다형성을 구현할 수 있습니다. 그것에. 또한 Student 메서드 테이블에 새로운 void Eat() 메서드가 있지만 현재 새 Eat()가 하위 클래스에 속하기 때문에 p에서 호출할 수 없습니다.

즉, 재정의된 메서드를 제외하고 p는 Person 메서드 테이블의 메서드만 호출할 수 있습니다. 해당 메서드를 찾을 수 없으면 개체가 나올 때까지 Person 상위 클래스의 메서드를 계속 검색합니다. 뒤돌아보지 않으며 학생 메서드 테이블

public  abstract class Person
    {
        public  int Id;
        public void Eat()
        {
            Console.WriteLine( "在吃梨");
        }
        public virtual void Walk()
        {
            Console.WriteLine("在散步");
        }
        //抽象方法只能在抽象类中声明,因此要在Person前加abstract,且只能声明并必须在子类中实现。
        public abstract void Run();
    }

public class Student:Person
    {
        public int studentId;
        public void GotoSchool()
        {
            Console.WriteLine("Go to School");
        }
 
        public new void Eat()
        {
            Console.WriteLine("学生  吃苹果");
        }
        public override void Walk()
        {
            Console.WriteLine("学生  在散步");
        }
        public override void Run()
        {
            Console.WriteLine("学生  在跑步");
        }
    }

C# 기본 메모리 할당

에서 메서드를 찾지 않습니다. 3. 이제 손자 개체를 가리킵니다.

Student 하위 클래스 James를 추가하겠습니다. 이전 예제에서 override 키워드로 재정의된 메서드만 상위 클래스에서 호출된다는 것을 이미 알고 있으므로 모든 일반 메서드를 삭제했습니다. 실행 코드는 Person p = new James() { name = “James”, StudentId = 2, Id = 4 }; 핵심 사항을 강조하기 위해 코드와 메모리 할당 다이어그램은 다음과 같습니다. 다이어그램의 필드. 결과를 보면 드디어 손자의 SayHi 메서드가 SayHi 메서드를 덮어쓰게 된 것을 알 수 있습니다. 여기에서 상속의 전이성을 확인할 수 있습니다!

public  abstract class Person
    {
        public  int Id;
        public virtual void Eat()
        {
            Console.WriteLine( "在吃梨");
        }
        public virtual void Walk()
        {
            Console.WriteLine("在散步");
        }
        //抽象方法只能在抽象类中声明,因此要在Person前加abstract,且只能声明并必须在子类中实现。
        public abstract void Run();
        public virtual void SayHi()
        {
            Console.WriteLine("人说:你好!");
        }
    }

public class Student:Person
    {
        public int studentId;
        public virtual void Eat()
        {
            Console.WriteLine("学生  在吃梨");
        }
        public override void Walk()
        {
            Console.WriteLine("学生  在散步");
        }
        public override void Run()
        {
            Console.WriteLine("学生  在跑步");
        }
    }

public class James:Student
    {
        public string name;
        public override void Eat()
        {
            Console.WriteLine("James  在吃梨");
        }
        public override void Walk()
        {
            Console.WriteLine("James  在散步");
        }
        public override void Run()
        {
            Console.WriteLine("James  在跑步");
        }
        public override  void SayHi()
        {
            Console.WriteLine("James说:你好!");
        }
    }

C# 기본 메모리 할당

위는 C# 기본 메모리 할당 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.