해결된 질문
작성
·
215
0
new로 동적할당하는 클래스 객체는 heap에 생성되고 프리미티브 타입이나 struct는 스택에 생성되어서 main 함수의 클래스 변수에서 클래스 객체를 참조할때 스택에서 힙으로 참조하고, 함수의 파라미터로 넘겨줄때 ref로 넘겨준 프리미티브 타입이나 struct는 스택에서 스택을 참조하는게 맞는 건가요?
클래스 객체내에서 클래스 변수를 가지고 있으면 힙에서 힙을 가리키는 것 같은데 맞는지 궁금합니다.
답변 2
2
프리미티브 타입이나 struct는 스택에 생성되어서
-> 대부분 맞긴 한데 struct라도 너무 사이즈가 크거나
내부적으로 참조값이 있으면 heap에 올라갈 수도 있습니다.
굳이 언급을 안 한 이유는,
관련된 정확한 C# 스펙이 표준에 있는 것은 아니라서
사실 heap/stack 중 어디 올라갈지는 우리가 굳이 알아야할 필요는 없습니다.
main 함수의 클래스 변수에서 클래스 객체를 참조할때 스택에서 힙으로 참조하고
클래스 객체는 heap에, main 함수의 변수는 stack에 있으니 맞습니다.
함수의 파라미터로 넘겨줄때 ref로 넘겨준 프리미티브 타입이나 struct는 스택에서 스택을 참조하는게 맞는 건가요
스택에 있는 struct 객체라면, 위 상황이 맞습니다
클래스 객체내에서 클래스 변수를 가지고 있으면 힙에서 힙을 가리키는 것 같은데
맞습니다.
그리고 클래스 변수가 있으면 사실 struct도 힙에 올라가긴 합니다.
위 관련해서 struct는 value-type, class는 reference-type이 핵심이고
사실 stack / heap 여부는 C++과 다르게 크게 신경쓸 필요가 없습니다!
그래도 궁금하시면 직접 코드를 넣어서 보는 방법이 있긴 합니다.
(unsafe 버전으로 C++ 포인터처럼 C#에서 포인터 강제 사용이 가능한데, 이를 이용한 주소 출력 및 변수 위치 확인)
0