인프런 커뮤니티 질문&답변

시에라웨이브님의 프로필 이미지
시에라웨이브

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

스택과 힙

stack과 heap

해결된 질문

작성

·

215

0

new로 동적할당하는 클래스 객체는 heap에 생성되고 프리미티브 타입이나 struct는 스택에 생성되어서 main 함수의 클래스 변수에서 클래스 객체를 참조할때 스택에서 힙으로 참조하고, 함수의 파라미터로 넘겨줄때 ref로 넘겨준 프리미티브 타입이나 struct는 스택에서 스택을 참조하는게 맞는 건가요? 

클래스 객체내에서 클래스 변수를 가지고 있으면 힙에서 힙을 가리키는 것 같은데 맞는지 궁금합니다.

답변 2

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

프리미티브 타입이나 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

늦은 시간에 빠른 답변 감사드립니다. 로드맵 따라서 정말 많은 도움 얻고 있습니다. 감사합니다.

시에라웨이브님의 프로필 이미지
시에라웨이브

작성한 질문수

질문하기