Generic Sharing
문제가 되는 부분이다.
제네릭 함수를 처리할때 좀 많은 애로사항들이 있다고 한다.
제네릭이 문제다!?
Cpp와 C#하고는 언어가 많이 다르기 때문에
그중 제네릭이 차이가 난다.
하나의 클래스, 하나의 코딩을 통해서 여러 타입에 일반화시켜서 재사용을 할수있어 코딩시간을 단축시켜주는 기능이다.
C# 제네릭을 처음 접했을때, cpp를 하던 사람들의 경우는 템플릿을 떠올린다고 한다.
사용법이 비슷하다고 한다.
그런데 Cpp에서는 코드에서는 한번만 작성하지만, 컴파일러 내부에서는 위의 사진에서 우측처럼 버전마다 함수를 다시 작성을 해주는 방식으로 구성된다고 한다.
클래스나 기본적인 원시타입 모두 지원을 한다.
따라서 템플릿을 많이 사용하면 많이 사용할 수록 그만큼 코드가 길어진다고 한다.
템플릿은 편하게 사용할 수 있지만, 코드사이즈가 늘어나는점은 감안을하며 만들어야하는 단점이 있다고 한다.
여기까지는 같다고 생각할 수 있는데.
이때 call by value / call by reference에서 차이가 난다.
value -> 데이터를 복제해서 넘긴다.
reference -> 데이터의 위치 정보만 넘긴다. 이 차이이다.
Cpp에서는 A라는 구조체를 만들고, int a,b,c,d,e를 내부에 넣어주면
int는 4byte이기때문에 데이터마다 주소가있으니 그 간격은 4byte만큼씩 떨어져있을것이다.
옛날에는 32bit 운영체제였고, 요즘은 64bit 운영체제
4byte -> 32bit
8byte -> 64bit
즉, 64비트 운영체제에서는 주소값자체도 8byte크기이다.
크게 함수를 호출할때 Cpp에서는 세가지 방식이 있다.
왼쪽부터 1,2,3 번 방식이라고 하면
1번 방식은 구조체 통째로 넘기는 방식으로 24byte가 넘어가게 된다.
이를 Call by value라고 한다.
그런데 2번째 방식, 포인터를 이용한 방식을 이용하게되면
이는 주소값을 가리키는 애가 된다. 이 포인터를 넘겨주게 되면 주소값만 넘겨주게 된다.
주소값 자체는 64bit 운영체제에서 8byte이기 때문에 8byte가 넘어가게 된다.
3번째 방식 또한 &를 통해 주소값을 넘겨받을 수 있어서
2번과 같이 8byte가 넘어가게 된다.
2,3번은 Call by reference이다.
근데 여기는 Cpp까지의 얘기이고
C#으로 넘어오면 어떤 데이터냐에 따라 자동적으로 결정을 해준다.
C#에서는
Value type -> struct, int, char, bool 등
Reference type -> Class, string, array
만약 함수에서
이런식으로 넘겨주게 되면
자동적으로 i는 Value타입으로, s는 참조타입으로 넘겨주게된다.
내부 C# 언어 안에서 넘어가는 방식이 정해져있다.
MSDN 문서를 찾아보면 어떤값들이 어떤 방식으로 넘어가는지 나와있다.
C#은 그래서 박싱, 언박싱이라는 개념도 생긴다. 이는 언어관련내용이니까 생략
따라서 제네릭으로 다시 넘어오면ㅎㅎ
Cpp의 템플릿으로 제네릭을 바로 변환을 할 수가 없다고 한다.
쫙 풀어서 만들어야 한다.
제네릭의 레퍼런스 타입의 경우는 제네릭을 하나로 만들어서 내부적으로 공유를 할 수 있다고 한다.(제네릭 쉐어링)
JIT방이기때문에 기본적인것만 만들어놓으면 그때그때 기계어로 필요할때 만들어서 쓰는데
이를 Cpp로 가져가면 미리 만들어놔야하기 때문에 코드길이가 경악스러울정도로 커진다고 한다.
즉, 제네릭을 많이 쓰면 많이 쓸수록 IL2CPP 변환 과정이 굉장히 오래걸린다고 한다.
그래서
IL2CPP 빌드시
이렇게 두가지 방식에서 의미하는것은
Faster run time performance : 레퍼런스 타입 제네릭은 공유 코드 사용. 벨류 타입 제네릭은 코드 확장. 알 수 없는 밸류 타입 제네릭이 발견되면 공유 코드 사용(기존 방식) -> 컴파일 과정이 오래걸림
Faster(smaller) builds: 벨류 타입 제네릭도 항상 공유 코드 사용(빌드 시간 및 사이즈 감소) -> 코드를 일일히 풀어내는것이 아니므로 코드 사이즈, 빌드사이즈가 줄어듬 다만, 런타임성능은 그만큼 떨어진다고함
라고 한다.
2번째 방식이 개발 이터레이션 과정에서는 시간을 줄일 수있게 되어 개발과정에서는 도움이 될 수 있다.
개발 과정에서만 2번, 최종 릴리즈에서는 1번 Faster runtime을 권장한다고 한다.
성능표이다.
'프로그래밍 > Unity' 카테고리의 다른 글
내가 보고싶은 Unity 코리아 영상 (1) | 2023.11.13 |
---|---|
유니티 팁 & 트릭 (1) | 2023.11.13 |
IL2CPP 1장 (0) | 2023.11.09 |
Overloading과 Overriding / method Signature 알아보기 (0) | 2023.10.20 |
코루틴 조금 더 자세한 내용 (0) | 2023.10.19 |