> 백엔드 개발 > C++ > 힙 또는 스택: `new`는 C# 구조체에 대한 메모리를 어디에 할당합니까?

힙 또는 스택: `new`는 C# 구조체에 대한 메모리를 어디에 할당합니까?

DDD
풀어 주다: 2025-01-13 15:16:41
원래의
732명이 탐색했습니다.

Heap or Stack: Where Does `new` Allocate Memory for a C# Struct?

C#에서 구조체를 생성하기 위해 "new" 키워드를 사용할 때 메모리는 힙에 할당되나요, 아니면 스택에 할당되나요?

"new" 연산자를 사용하여 클래스 인스턴스를 생성하면 힙에 메모리가 할당됩니다. 그러나 "new" 연산자를 사용하여 구조 인스턴스를 생성할 때 메모리는 어디에 할당됩니까?

스택 메모리와 힙 메모리

스택은 프로그램 실행 중에 지역 변수와 메소드 호출을 저장하는 데 사용되는 데이터 구조입니다. LIFO(후입선출) 구조는 가장 최근에 할당된 메모리가 먼저 제거된다는 의미입니다.

힙은 필요에 따라 객체가 생성되고 할당되는 동적 메모리 공간입니다. 스택과 달리 특정 메모리 할당 순서를 따르지 않습니다.

구조에 대한 메모리 할당을 생성하려면 "new" 키워드를 사용하세요

구조의 경우 "new" 연산자를 사용할 때 다음 두 가지 상황을 고려해야 합니다.

  1. 매개변수 없는 생성자(new Guid();):

    • "new" 연산자와 매개변수 없는 생성자를 사용하면 의 구조에 메모리를 할당합니다.
    • 이는 C# 컴파일러가 매개 변수가 없는 생성자를 특수 사례로 처리하여 0 초기화 작업으로 처리하기 때문입니다.
    • 따라서 힙에 새로운 메모리 위치가 생성되고 그 안에 구조가 구성됩니다.
  2. 매개변수가 있는 생성자(new Guid(someString);):

    • "new" 연산자와 매개변수화된 생성자를 사용하면 임시 저장을 위해 스택에 메모리를 할당합니다.
    • 생성자가 구조를 초기화한 후 할당된 스택 메모리는 삭제됩니다.
    • 이 프로세스는 매개변수 없는 생성자와 마찬가지로 인스턴스화된 구조를 로컬 변수에 할당하여 힙에 메모리를 할당하는 것과 다릅니다.

IL 코드 생성

뒤에서 무슨 일이 일어나고 있는지 이해하기 위해 C# 컴파일러에서 생성된 중간 언어(IL) 코드를 살펴보겠습니다.

  • newobj 지시문은 스택에 공간을 할당하고 중간 값(예: 메서드 매개 변수)에 대해 매개 변수가 있는 생성자를 호출합니다.
  • call instance 지시문은 매개변수화된 생성자를 사용하여 할당된 저장 위치(스택 또는 힙)를 초기화합니다.
  • initobj 명령어는 할당된 저장소 위치(스택 또는 힙)를 초기화하여 해당 내용을 0으로 지웁니다(매개변수 없는 생성자 호출의 경우).

결론

요약하자면, 항상 힙에 메모리를 할당하는 클래스 인스턴스와 달리 구조체에 "new" 연산자를 사용하면 매개변수가 없는 생성자의 경우와 매개변수가 있는 메모리 할당의 경우 힙에 메모리가 할당됩니다. 스택에(임시 저장용) 이 동작은 생성된 IL 코드에 반영되며 기본 메모리 관리 프로세스에 대한 통찰력을 제공합니다.

위 내용은 힙 또는 스택: `new`는 C# 구조체에 대한 메모리를 어디에 할당합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿