Vector3는 위치 설정을 위해 빈번하게 사용된다.
gameObject.transform.position = new Vector3(0,0,0);
gameObject에 위치를 할당할 때 new를 사용하는 것을 보고 힙에 할당하는 줄 알고 사용하기가 꺼려졌다.
계속 Vector3를 사용해도 되는 걸까?
#1 의문
"왜 위치값을 넣어줄 때 new를 붙여서 Vector3를 생성하는 걸까. 이는 Heap에 할당되는 것인가 Stack에 할당되는 것인가"
일단 Vector3 정체는 구조체이다.
https://3dmpengines.tistory.com/1566
해당 게시글도 같은 의문점을 가졌다.
요약하자면 Vector3는 구조체가 맞고 new로 생성 시, 스택에 메모리가 할당된다.
게시글의 실험 재확인차 Update에서 구조체와 클래스를 100만번씩 생성해보았다.
클래스 생성시 GC allocated (=Heap) : 15mb / 구조체 생성시 0.15mb
new를 붙여도 struct은 스택에 할당된다는 것을 확인했다.
요동치는 Totla GC Allocated?
Total GC Allocated : 전체 GC 할당된 량
GC Allocated : GC 할당된 량
해석 : GC할당량은 일정한데 전체 GC 할당량이 요동치는 것으로 보아 GC 컬렉터가 열심히 일하면서 GC에 할당된 메모리를 해제하고 있다는 것을 알 수 있다.
#2 그럼 왜 new를 사용하나요? 헷갈리게..
https://www.tutorialsteacher.com/csharp/csharp-struct
new를 사용하면 생성자를 호출하고, 생성자가 struct에 메모리를 할당한다. (초기화)
하지만 new를 사용하지 않을 경우 생성자가 호출되지 않아 메모리가 할당되지 않은 상태, 그 상태로 사용하려고 하면 컴파일 단계에서 오류가 난다. struct를 사용하려면 각각 맴버의 값을 채워줘야 사용 가능하다.
=>해석 : 생성자를 호출해서 맴버들을 한 번에 초기화 해주던가 or 따로따로 값을 채워주어야 struct 사용가능하게 해둠
예시로 한 방에 이해하기
#3 결론 :
new 키워드를 사용한다고 다 Heap에 할당되지 않는다.
Struct의 경우 new를 사용하더라도 Stack에 할당된다.
new != 동적 할당/ new == 생성자 호출
new 키워드를 강제했던 것은 C#에서 생성자 이용해서 struct 맴버 값을 다 채우라는 의미
따라서, struct의 맴버값을 채워준다면 new 없이도 struct 사용가능
#4 남은 궁금증
C++에서는 new없이 가능했던 걸로 기억하는데..
Go 가비지 컬렉터란?!
Go 힙/스택이란?!
'Programming > Unity' 카테고리의 다른 글
[Unity] 유니티는 단일 쓰레드 (0) | 2020.03.03 |
---|---|
[Unity] MonoBehaviour (0) | 2020.03.03 |
[Unity] Json 라이브러리 (0) | 2020.03.03 |