Value Type 을 사용함에 있어서 .Net Framework를 빠르게 만드는 Tip을 설명한다.
우선 Value Type 과 Reference Type은 메모리 구조적으로 차이가 있다.
아래에서 보면 Reference Type은 두개의 헤더 필드를 갖는다.
Object header Word는 32bit에서는 4byte, 64bit에서는 8byte의 길이를 갖는다.
이러한 차이로 객체를 수없이 많이 사용할 때에는 메모리의 차이가 극심해 진다.
struct/class Point2
{
int X, int Y
}
만약 위의 Point2와 같은 객체를 1만개 생성할 때에는 Reference type의 경우는 32만 byte를 갖게 되며 Value Type의 경우에는 8만 byte를 갖는다.
두 type의 메모리 구조의 차이도 있지만 만약에 Equal 의 기능을 수행할 때에는 Boxing 문제가 발생하여 그 수행하는 시간이 많이 차이가 난다. 구조적으로 Boxing 을 수행하는데에는 cost가 상당하다.
이러한 문제를 해결하기 위해서 3가지를 구현하면 위의 문제를 해결할 수 있다.
예제 코드
struct PointV4 : IEquatable<PointV4>
{
public int X;
public int Y;
public override bool Equals(object obj)
{
if (!(obj is PointV4)) return false;
PointV4 other = (PointV4)obj;
return X == other.X && Y == other.Y;
}
public bool Equals(PointV4 other)
{
return X == other.X && Y == other.Y;
}
}