호우동의 개발일지

Today :

article thumbnail

썸네일

 

 

클래스(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

 

[Unity 3D] 프로파일러(Profiler)로 퍼포먼스 스파크(Performance spark) 현상 알아보기

프로파일러 유니티 엔진에서 제공해 주는 유니티에서 개발하고 있는 앱을 분석할 수 있는 툴 매 프레임마다 구체적인 퍼포먼스를 분석할 수 있음 게임의 최적화를 위해 사용 Deep Profile을 통해

howudong.tistory.com

 

 

 

  • 메모리 할당이 상당히 많이 되는 것을 볼 수 있음

결과

 

 

 

 

 

Struct

퍼퍼몬스 스파크
결과

  • 구조체를 할당하여도 퍼포먼스에 영향이 없다.

 

 

 

 

결론

  • 전역변수나 여러 함수에서 사용되는 변수일 경우 class 사용
  • 한 함수(메서드) 안에서만 사용하는 멤버변수는 struct 사용하는 게 최적화
    • 반복문의 임시변수, 한 함수의 멤버 변수 등