아디봉의.net
C#에서의 포인터 사용 본문
unsafe 코드
c#에서 포인터(*)를 기본으로 사용하지 않는다. c#에서는 CLR이 메모리를 알아서 관리해주기 때문에 사용자가 직접 메모리를 건드리는것은 안전하지 않다.
이러한 불안전한 구조에서 포인터를 사용한코드를 "unsafe"코드라고 한다.
unsafe 코드 처리하는 예
using system;
class UnsafeTest2{ //unsafe함수
unsafe static void CallByPoint(int* x){
*x = 10000;
}
public static void Main(){
int x1 = 10;
unsafe{ //unsafe블록
CallByPoint(&x1);
}
Console.WriteLine("Call-By-Point: {0}", x1);
}
}
스택과 힙과 포인터
힙 메모리는 가비지 콜렉터가 관리하지만 스택의 메모리는 함수가 호출할 때마다 자동으로 생성되었다가 자동으로 제거됨
힙메모리
관리를 가비지 콜렉터가 하기 때문에 포인터로 핸들하고 있을때 콜렉터가 조각모음이나 메모리 정리 작업을 통해서 메모리를 이동시킬 위험이 있다.
스택메모리
- 스택의 메모리는 함수가 호출되는 동안에는 포인터로 접근해서 사용해도 되는 메모리
포인터를 사용하는 이유
- 다른언어와의 호환성때문 즉 c계열언어와의 호환성을 위해서 포인터를 제공한다고 보는것이 옮다.
fiexd 키워드
사용자가 포인터를 사용하고 있을 때 메모리의 고정을 보장해주는 역할을 하고 있다.
CLR에 의해서 해당 메모리의 포인터를 이동 시키지 못하게 막아준다.
ex) using System;
class Point{
public int x, y;
}
class FixedTest1{
unsafe static void DoubleSum(int* P){
int a = *p;
*p = a+a;
}
unsafe static voidMain(){
Point pt = new Point();
pt.x = 5;
pt.y = 6;
fixed(int* p = &pt.x){
DoubleSum(p);
}
Console.WriteLine("{0}{1}", pt.x , pt.y)
}
}
'C#' 카테고리의 다른 글
[C#] 각종 언어 계층구조도 및 간략설명 정리파일모음사이트 (0) | 2012.11.29 |
---|---|
c# 책 인터넷으로 읽어보기 (0) | 2012.09.27 |
C# const 상수 (0) | 2012.09.17 |
C# static 과 상수 (0) | 2012.09.16 |
call by XXX (0) | 2012.09.16 |