C#.NET Q&A

C# Instance 생성시 Method가 stack에 올라가는 타이밍 질문 한량품 평점: 없음 조회: 130
메모리를 효율적으로 사용하고 싶어서 질문올립니다.
 
어떤 클래스에 대한 새로운 인스턴스를 생성할 때 그 클래스에 대한 매소드가 곧바로 스텍 영역에 올라가나요? 질문을 정리하면 아래와 같은 Goal 클래스가 있을 때 새로운 인스턴스를 생성하면 GetPort와 GetLabel 매소드가 바로 스택 메모리에 올라가는지 질문입니다.
 
public class Goal
{
    public string Port { get; set; }
    public string Label { get; set; }
    public int TskID { get; set; }
 
    public void GetPort(string port)
    {
        Port = port;
    }
    public void GetLabel(string label)
    {
        Label = label;
    }
}
 
왜 이질문을 하냐면 만약에 제가 위에 있는 Goal 클래스를 List<Goal> 로 만들어 놓아서 List에 엄청 많은 Goal 인스턴스를 넣어놓으면 안쓰는 매소드가 메모리에 무쟈게 올라가는지 궁금해서 질문하는 것입니다.
 
질문 1. 인스턴스 생성시 클래스에 정의 되어있는 매소드가 전부 stack 영역에 올라가나요?
태그 : 매소드 메모리 스택 memory method stack
작성자 정보
한량품
Level 3
 [EXP.11/16]

메일:  비공개
글등록 +12 24 덧글등록 +3 3
자기소개
한량스럽게 코딩을해용
글 공유하기 |
  tweet facebook
2018-10-06 오전 11:17:34
나도한마디
사용자
롬메달            [2018-10-08]
Level 51
 [EXP.162/250]
오랫만에 생각하게 하는 질문이네요.
일단 저의 답변이 확실한 답이 아니라는것을 전제하고 말씀드리겠습니다.

먼저,
GC를 이용한 Managed Language를 사용하시면서 메모리 관리를 직접(물른 직접 한다는게 아니라 효율적으로 사용하겠다는 말씀이시겠죠)하실려고 하는게 조금은 아이러니 하지만, 그래도 좋은 시도인것 같습니다.

그리고,
객체를 생성하면 스택이 아닌 힙에 생성됩니다. 스택은 차곡차곡 쌓아지는 형태구요.
객체들이 힙에 펼쳐지는 상황에서 아마도 c/c++의 포인터를 공부하셨으면 어느정도 유추가 가능할것 같은데,
각 부분은 함수 포인터로 관리될 겁니다.
즉, aaa.GetLabel("temp"); 를 호출하면 객체에서 함수의 포인터를 찾아서 호출하는 형태가 되겠죠.
만약에 GetLabel(...)내부에, 복잡한 로직, 많은 변수 들이 있다고 해서 한번에 그 모든것들이 클래스가 객체가 되는 시점에 다 생성되지는 않습니다.
그렇기 때문에 우리는 함수의 형태만 알고 있고, 이후에 실행시 호출되어 동작하면서 내부의 많은 부분을 생성한다고 보면 됩니다.

또한, 함수의 호출시작과 종료에 따라서 내부의 변수및 로직들이 사라지는것을 알기에, 내부가 스택구조로 호출된다는것을 알수가 있겠죠.

정확하진 않지만 제가 알고있는 내용을 기반(뇌피셜)으로 말씀드렸습니다.
사용자
몬난아            [2018-10-08]
Level 71
 [EXP.180/250]
https://stackoverflow.com/questions/17716420/is-separate-memory-allocated-for-functions-and-properties-of-an-object

해당 질문의 답변을 보시면 도움이 될것 같아요.

기본적으로 힙에 쌓이는구조이고 . 함수도 메소드 테이블이라는 다른 데이터 구조를 포인터 형태로 유지하고 호출하는것 같긴한데 엄청 작은 용량이고 동적인 할당을 한다는것 같아요.
영어가 짧아서 정확한건진 모르겟지만..
사용자
파란초코            [2018-10-09]
Level 4
 [EXP.9/16]
메서드자체는 메서드를 저장하는 영역에 따로 저장되고 인스턴스는 해당 메소드에 대한 메소트 테이블의 포인터값을 힙에 다른 멤버변수와 함께 저장됩니다.

메소드의 실행코드는 인스턴스와 함께 힙에 저장되지 않으니 걱정 안하셔도 될 듯합니다.
사용자
한량품            [2018-10-09]
Level 3
 [EXP.11/16]
제가 네이버에도 글을 올렸는데요 이분께서 자세히 글을 올려주셨네요

https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040102&docId=311464755

결론은 실제로 매서드는 어딘가에 하나만 생성되고 이것을 각 인스턴스가 호출하는 방식으로 된다고 하네요.
그래서 메모리 걱정은 안해도 된답니다!
태그로 엮인글
[C#.NET Q&A] [C# WPF] 특정 프로세스의 메모리 사용률 질문입니다. 파일첨부 pixoneerr
[C#.NET Q&A] c# 메모리가 끝없이 올라감  엘리엇
[C#.NET Q&A] 보호된 메모리를 읽거나 쓰려고 했습니다. 대부분 이러한 겨우는 다른 메모리가 손상되었음을 나타냅니다.[1] 파일첨부 오하우하
[C#.NET Q&A] C# winform 에서 스레드 메모리 관리 질문[2]+3  시에라
[C#.NET Q&A] 점유 메모리 문제 질문 드립니다.   시에라
[C#.NET Q&A] 가비지 컬렉터 클래스질문[2]  데브로스
[WPF Q&A] WPF 화면크기 메모리와 메모리해제 관련[3]  darkmaste
[C#.NET Q&A] Streamreader 를 이용한 대용량 텍스트 파일 불러온 뒤의 작업[1]+2  필승불패
[C#.NET Q&A] 비쥬얼스튜디오 2015에서 메모리 상태창이 사라졌어요[1]+1  HimoTsuke
[WPF Q&A] WPF 화면크기 메모리[2]  심연의감시자
글리스트
c# mysql 이미지 파일 연동 문제  유르석
[RE] c# mysql 이미지 파일 연동 문제  hoon
c# mysql 이미지 파일 연동 문제  유르석
c# mysql 이미지 파일 연동 문제[2]  유르석
스트링작업 도움부탁합니다[1]+3  엿장수
datagridview addrow speed 문제?[1]  hoon
여러개 루트를 가진 xml파일 읽어오기[1]  섭융
미쓰비시 PLC 통신 이더넷 통신 도움주시면 감사하겠습니다ㅠ[1]  tokhi
윈폼 폼 질문드립니다.[1]+1  키모
C# textBox 줄 간격 질문입니다. (텍스트 박스, 줄간격,여백)  프린이
 ★현재글->   C# Instance 생성시 Method가 stack에 올라가는 타이밍 질문[4]  한량품
Excel oledb이용해서 그리드뷰에 출력하고싶어요[1]+1  방랑이z
C# 웹 API 연동시 JSON PUT방식[1]  악어
시리얼 통신 궁금한 점이 있습니다![3]+1  tokhi
FindWindow관련 질문입니다.[2]+3  덱스터v
c# 유튜브 live streaming app 개발 중입니다.[1]  이기현
c# winform webBrowser[1]  hoon
List<> 빠르게검색하는방법 질문입니다[3]  엿장수
C# Window Form 마우스좌표와 키보드입력에 대해 질문드립니다.  기나규
C# 문자 질문드립니다.  키모
윈폼 리스트박스 스크롤 사이즈 질문드립니다.[1]+1  키모