개요
흔히 면접 준비 때 박싱에 대해서 공부하게 된다.
하지만 실무에서는 거의 대부분 고려할 일이 없어서 시간이 지날수록 왜곡된 기억과 함께 여러 오해가 생기게 되었는데 관련해서 정리하려 한다.
박싱에 대하여
Stack에 있던 값을 Heap으로 옮기는 작업.
스택에 있는 값을 Heap으로 옮기면서, Heap에 메모리 할당, 값 복사가 일어나서 느리다.
더 자세한 내용은 구글에 C# 박싱을 검색....
int a = 5;
object boxedA = a;
Dictinary의 Key로 enum을 사용하면 안 되는가?
.Net 4.0부터 Dictinary가 개선되어서 문제가 없어졌다.
이전에는 Dictinary 내부에서 Equal 함수를 사용하는데 이때, Enum 간 Equal 체크 시에 박싱이 일어나는 문제가 있었다.
그래서 enum을 int로 변환하거나 Enum 비교 함수를 직접 넘겨서 처리를 하곤 하였는데, 이제는 개선되어서 더 이상 복잡하게 사용하지 않아도 괜찮다.
20배 느리다?
여러 글을 보면 20배 느리다고 하여서 무슨 엄청난 죄악인 것 마냥 느껴지는데, 사실 MSDN에 보면 단순 참조 할당(class a = b;)에 비해 20배 느리다고 되어 있다.
즉 그냥 int를 힙에 할당해서 느리다는 것이지, 박싱이라서 특별하게 더 느리다는 것은 아니니 오해는 하지 말자.
- 20배 느리다는 MSDN : https://learn.microsoft.com/ko-kr/dotnet/framework/performance/performance-tips
List를 Add에 할 때마다 박싱이 일어나는가?
List는 class이므로 힙에 할당된다.
그리고 List 내부의 element들은 배열에 저장되기 때문에 역시 힙에 할당된다.
그러면 Add() 시에는 박싱이 되는 것이 아닌가?
아니다. 이미 배열이 힙에 생성되어 있기 때문에 값을 스택->힙으로 옮기는 것이지, 복사 및 할당을 하는 [박싱]이라고 할 수 없다.
아주 당연한 이야기인데 박싱의 함정에 빠져서 이런 이상한 질문도 헷갈리게 되었다;;
'Programming > C# & Unity' 카테고리의 다른 글
C# 람다 클로저 원리 (0) | 2023.08.26 |
---|---|
C# Foreach Closure (6) | 2023.06.18 |
C# static 멤버 함수 (0) | 2022.11.20 |
C# Async Await 원리 (2) | 2022.11.16 |
C# Enum Flag (2) | 2022.09.16 |