강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của leaprealm
leaprealm

câu hỏi đã được viết

[Loạt bài phát triển game MMORPG thực hiện bằng C# và Unity] Phần 1: Giới thiệu lập trình cơ bản C#

chồng và đống

stack과 heap

Đã giải quyết

Viết

·

312

0

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

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

C#

Câu trả lời 2

3

Rookiss님의 프로필 이미지
Rookiss
Người chia sẻ kiến thức

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

leaprealm님의 프로필 이미지
leaprealm
Người đặt câu hỏi

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

Hình ảnh hồ sơ của leaprealm
leaprealm

câu hỏi đã được viết

Đặt câu hỏi