언어 C#.NET 유용한 포인터 사용법(1) - 스택기반의 배열
2006.08.14 10:04
배열을 선언할 때,
대개의 .NET 언어들은 랩핑시켜둔 고유의 키워드(인덱서)를 이용하여
그러나 이렇게 생성된 배열은 실제론 System.Array의 인스턴스이고 그 때문에 어쩔 수 없이 갖게 되는 몇 단점들이 있습니다.
바로 초기화작업으로 인한 느린 생성과 객체 참조 시의 어쩔 수 없는 오버헤드입니다.
(물론 이는 앞으로 보여줄 스택기반배열에대한 상대적인 비교입니다.)
사실 위와같이 일반 배열을 사용해도 보통 크게 문제될건 없지만,
어마어마한 반복작업탓에 약간의 오버헤드도 큰 문제를 야기할수 있는 때에
System.Array의 인스턴스가 아닌
*C#.NET 에서 포인터는 unsafe 블록을 선언하여 그 내부에서만 사용할 수 있습니다.
이렇게 stackalloc키워드로 할당이 된 배열은 stackalloc키워드가 반환하는 포인터를 이용해
그렇지만,
보통 C#에서의 포인터 사용을 권하지 않는것처럼
역시 이 방법도 배열을 선언하는 일반적인 방법으로는 추천할 수 없습니다..
확실히 이를 통해 오버헤드없는 성능 위주의 배열을 생성할순 있겠습니다만,
System.Array가 제공하는 여러가지 유용한 멤버들(Length 속성 등)을 사용할수 없을 뿐더러
심각한 데이타 파괴를 야기할수도 있기 때문입니다.
[홀개발자의 작업이라면 몰라도, 다른 개발자들이 깜빡 실수를 할수도 있거든요.(고의라던가..)]
PS : System.Array의 인스턴스라는 이야기에
(자주 사용하시는)ArrayList를 사용할때처럼 new 키워드로 인스턴스화 하시려는 분이 계신데,
System.Array는 abstract가 붙어있는 추상 클래스이고
인스턴스를 생성하기위해선 CreateInstance라는 메서드를 사용해야합니다.
*인자는 배열의 타입과 크기를 받습니다.
(추상 클래스는 .NET 2.0부터 추가된 static이 붙는 정적 클래스처럼 인스턴스화가 되지 않는 특성을 가지고 있습니다.)
--------------------------------------------------
기분이 나면 언어 스펙부터 차근차근 써보도록 하겠습니다.
출저는 http://geekproject.net/ (제 블로그)입니다. 저좀 많이 사랑해주세요^^ [하악하악]
대개의 .NET 언어들은 랩핑시켜둔 고유의 키워드(인덱서)를 이용하여
int[] m_array = new int[5];
와 같이 일차원 배열부터 다차원 배열까지 쉽게 선언해 사용할 수 있습니다.그러나 이렇게 생성된 배열은 실제론 System.Array의 인스턴스이고 그 때문에 어쩔 수 없이 갖게 되는 몇 단점들이 있습니다.
바로 초기화작업으로 인한 느린 생성과 객체 참조 시의 어쩔 수 없는 오버헤드입니다.
(물론 이는 앞으로 보여줄 스택기반배열에대한 상대적인 비교입니다.)
사실 위와같이 일반 배열을 사용해도 보통 크게 문제될건 없지만,
어마어마한 반복작업탓에 약간의 오버헤드도 큰 문제를 야기할수 있는 때에
System.Array의 인스턴스가 아닌
unsafe
{
//stackalloc 키워드는 메모리할당작업만을 합니다.
//인스턴스화와 같이 불필요한 초기화작업은 하지 않습니다.
int *stack_based_Array = stackalloc int [20];
}
와 같이 비안전영역에서 포인터를 사용하여 스택기반배열을 선언, 사용할 수가 있습니다.{
//stackalloc 키워드는 메모리할당작업만을 합니다.
//인스턴스화와 같이 불필요한 초기화작업은 하지 않습니다.
int *stack_based_Array = stackalloc int [20];
}
*C#.NET 에서 포인터는 unsafe 블록을 선언하여 그 내부에서만 사용할 수 있습니다.
이렇게 stackalloc키워드로 할당이 된 배열은 stackalloc키워드가 반환하는 포인터를 이용해
*(stack_based_Array+1) = 1;
와 같이 일반적인 포인터를 다루듯이 배열의 각 원소들을 접근할수도있고 stack_based_Array[1] = 1;
와 같이 인덱서를 사용해서도 접근이 가능합니다.그렇지만,
보통 C#에서의 포인터 사용을 권하지 않는것처럼
역시 이 방법도 배열을 선언하는 일반적인 방법으로는 추천할 수 없습니다..
확실히 이를 통해 오버헤드없는 성능 위주의 배열을 생성할순 있겠습니다만,
System.Array가 제공하는 여러가지 유용한 멤버들(Length 속성 등)을 사용할수 없을 뿐더러
unsafe
{
int *stack_based_Array = stackalloc int [20];
//할당된 메모리 영역 밖을 가르키는 인덱서입니다.
stack_based_Array[30] = 6;
}
와 같이 할당된 영역이 아닌 전혀 엉뚱한 영역을 접근하여{
int *stack_based_Array = stackalloc int [20];
//할당된 메모리 영역 밖을 가르키는 인덱서입니다.
stack_based_Array[30] = 6;
}
심각한 데이타 파괴를 야기할수도 있기 때문입니다.
[홀개발자의 작업이라면 몰라도, 다른 개발자들이 깜빡 실수를 할수도 있거든요.(고의라던가..)]
PS : System.Array의 인스턴스라는 이야기에
(자주 사용하시는)ArrayList를 사용할때처럼 new 키워드로 인스턴스화 하시려는 분이 계신데,
System.Array는 abstract가 붙어있는 추상 클래스이고
인스턴스를 생성하기위해선 CreateInstance라는 메서드를 사용해야합니다.
*인자는 배열의 타입과 크기를 받습니다.
(추상 클래스는 .NET 2.0부터 추가된 static이 붙는 정적 클래스처럼 인스턴스화가 되지 않는 특성을 가지고 있습니다.)
기분이 나면 언어 스펙부터 차근차근 써보도록 하겠습니다.
출저는 http://geekproject.net/ (제 블로그)입니다. 저좀 많이 사랑해주세요^^ [하악하악]
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
31 | MSN 주소를 알려주세요. [3] | MrGeek | 2006.09.16 | 85 |
30 | [소스첨부] 인자값 변경. | 청연 | 2006.09.14 | 59 |
29 | 주석제거 프로그램 (수정) | 청연 | 2006.09.13 | 128 |
28 | ★C언어 처음 하시는분들 보세요.. [3] | 청연 | 2006.09.13 | 202 |
27 | 2. Direct로 그림그리기! [1] | 케이코냥이 | 2006.09.03 | 166 |
26 | 한국 위키백과를 추천합니다. | MrGeek | 2006.09.01 | 84 |
25 | 1. DirectX 8.0 sdk 해보기. | 케이코냥이 | 2006.08.28 | 154 |
» | C#.NET 유용한 포인터 사용법(1) - 스택기반의 배열 | 괴짜인간 | 2006.08.14 | 124 |
23 | VB/VC 키코드 리스트 [1] | 알닭 | 2006.04.23 | 202 |
22 | [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -4- [2] | 울스M | 2006.02.08 | 215 |
21 | [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -3- [2] | 울스M | 2006.02.08 | 160 |
20 | [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -2- [5] | 울스M | 2006.02.08 | 173 |
19 | [울스M프로젝트?!-┏]Html 기초부터 탄탄히 ! -1- [2] | 울스M | 2006.02.08 | 558 |
18 | [비법은 아니지만] 비주얼 베이직에 이스터 에그 발견! [1] | StartCraft | 2006.02.06 | 287 |
17 | 질문이요. [2] | 블랙호크 | 2006.01.06 | 125 |
16 | 비트맵&브레인스토밍&프로그래밍의 도(道) [1] | 성령의분노 | 2006.01.04 | 307 |
15 | 자료구조 (3) - 링크리스트 [3] | 성령의분노 | 2006.01.01 | 209 |
14 | 자료구조 (2) - Queue[민프레스 강의정리] [1] | 성령의분노 | 2005.12.31 | 150 |
13 | 자료구조 (1) - Stack [민프레스 강의정리] | 성령의분노 | 2005.12.30 | 321 |
12 | [VB] [CD-ROM] CD-ROM 열고 닫기 | StartCraft | 2005.08.21 | 351 |