클래스(Class)와 구조체(Struct)의 차이
Class
- 참조 형식으로 Heap 영역에 할당
- 제거될 때 가비지 컬렉터(Garbage Collector)에 의해 수거됨
- 상속 가능
Struct
- 값 타입이고 스택(Stack)에 할당됨
- 함수에서 나갈 때 CLI에 의해 수거됨
- 상속이 불가능함
프로파일러로 분석
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Assign_Test : MonoBehaviour
{
public bool triggerClass;
public bool triggerStruct;
// 클래스
class Test_class
{
int a;
};
// 구조체
struct Test_struct
{
int a;
};
private void Awake()
{
triggerClass = false;
triggerStruct = false;
}
private void Update()
{
if (triggerClass)
{
for(int i = 0; i < 1000; i++) new Test_class(); // 클래스 할당
}
if (triggerStruct)
{
for (int i = 0; i < 1000; i++) new Test_struct(); // 구조체 할
}
}
}
- 각 trigger 체크 시 클래스나 구조체를 프레임당 1000개씩 생성하는 스크립트를 통해 실험
Class
- 주기적으로 퍼포먼스 스파크 현상이 발생
퍼포먼스 스파크
: 가비지 컬렉터가 한 번에 사용하지 않는 heap 변수를 정리하는 것- 자세한 내용은 아래 링크 참조
https://howudong.tistory.com/180
- 메모리 할당이 상당히 많이 되는 것을 볼 수 있음
Struct
- 구조체를 할당하여도 퍼포먼스에 영향이 없다.
결론
- 전역변수나 여러 함수에서 사용되는 변수일 경우 class 사용
- 한 함수(메서드) 안에서만 사용하는 멤버변수는 struct 사용하는 게 최적화
- 반복문의 임시변수, 한 함수의 멤버 변수 등