C#에서 new
연산자에 의한 구조의 메모리 할당: 힙 또는 스택?
new
연산자를 사용하여 클래스를 인스턴스화하면 메모리가 힙에 할당됩니다. 그러나 구조체에 대한 new
연산자의 동작은 특정 시나리오에 따라 다릅니다. 차이점을 살펴보겠습니다.
매개변수가 있는 생성자
new
을 사용하여 매개변수화된 구조체 생성자를 호출하면 스택에 메모리가 할당됩니다. 이는 값 유형의 지역 변수에 값을 할당하는 것과 유사합니다.
<code class="language-csharp">Guid local = new Guid("");</code>
할당된 IL 코드는 newobj
을 사용하여 스택에 메모리를 할당하고 제공된 문자열을 사용하여 값을 초기화합니다.
매개변수가 없는 생성자
new
을 사용하여 구조체의 매개변수 없는 생성자를 호출할 때 동작은 컨텍스트에 따라 달라집니다.
스택에는 메모리가 할당되지 않습니다. 대신 initobj
을 사용하여 기존 저장 위치(필드 또는 로컬 변수)를 초기화하세요. 값 유형은 내부에서 구성됩니다.
<code class="language-csharp">Guid field; ... field = new Guid();</code>
스택에 임시 지역 변수를 할당하고 initobj
을 사용하여 초기화합니다. 그런 다음 이 값은 메서드에 매개 변수로 전달됩니다.
<code class="language-csharp">MethodTakingGuid(new Guid());</code>
스택에는 메모리가 할당되지 않습니다. 값 유형은 인스턴스 또는 정적 변수의 저장 위치에 직접 구성됩니다.
<code class="language-csharp">myInstance.GuidProperty = new Guid();</code>
결론
구조와 함께 사용될 때new
연산자의 할당 동작은 컨텍스트에 따라 다릅니다. 매개변수가 있는 생성자의 경우 메모리는 항상 스택에 할당됩니다. 매개 변수가 없는 생성자의 경우 컨텍스트에 따라 메모리가 스택에 할당되지 않을 수 있습니다. 이 동작은 C# 코드를 변환할 때 컴파일러에서 생성된 IL 지시문에 따라 크게 달라집니다.
위 내용은 힙 또는 스택: `new`는 C#에서 구조체를 어디에 할당합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!