C# Advanced – csharpstudy 유튜브 강의 정리
https://www.youtube.com/watch?v=j0FYmsNvQbY&list=PLiNvMfa_Y5hcR5N0yFzi1KlK_e8zBaIrD
- 포인터와 레퍼런스의 차이는?
포인터와 레퍼런스의 차이는?
포인터 (Pointer)
void* p = &buff;
고정된 임의의 데이터에 대한 메모리 주소
Native Heap
레퍼런스 (Reference)
MyData obj = new MyData();
이동할 수 있는 객체에 대한 메모리 주소
Managed Heap
가비지 컬렉션이 발생하면 객체의 주소가 이동할 수 있다.
unsafe void ReferenceRun()
{
for (int i = 0; i < 100000; i++)
{
var obj = new MyData();
}
var data = new MyData();
data.Value = 55;
// data 객체가 Managed Heap 에서 이동할 수 있기 때문에 data 객체를 고정시킨다.
fixed (int* p = &data.Value)
{
Console.WriteLine("Address : {0}", (int)p);
}
for (int i = 0; i < 100000; i++)
{
var obj = new MyData();
}
GC.Collect();
fixed (int* p = &data.Value)
{
Console.WriteLine("Address : {0}", (int)p);
}
}
결과:
Address : 50993656 // 가비지 컬렉션 전 주소
Address : 49911440 // 가비지 컬렉션 후 주소