본문 바로가기

Programming/Unity

[Unity] Vector3는 Heap에 메모리 할당??

Vector3는 위치 설정을 위해 빈번하게 사용된다. 

gameObject.transform.position = new Vector3(0,0,0);

gameObject에 위치를 할당할 때 new를 사용하는 것을 보고 힙에 할당하는 줄 알고 사용하기가 꺼려졌다.
계속 Vector3를 사용해도 되는 걸까?

 

#1 의문

"왜 위치값을 넣어줄 때  new를 붙여서 Vector3를 생성하는 걸까. 이는 Heap에 할당되는 것인가 Stack에 할당되는 것인가"

일단 Vector3 정체는 구조체이다.

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 사용가능하게 해둠

 

 

 

예시로 한 방에 이해하기

맴버 값을 다 채워주니 new 없이 사용이 가능하다.

 

 

 

 

#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