메뉴 건너뛰기

창조도시 기록보관소

언어 C#.NET 유용한 포인터 사용법(1) - 스택기반의 배열

2006.08.14 10:04

괴짜인간 조회 수:124 추천:2

배열을 선언할 때,
대개의 .NET 언어들은 랩핑시켜둔 고유의 키워드(인덱서)를 이용하여
int[] m_array = new int[5];  
와 같이 일차원 배열부터 다차원 배열까지 쉽게 선언해 사용할 수 있습니다.
그러나 이렇게 생성된 배열은 실제론 System.Array의 인스턴스이고 그 때문에 어쩔 수 없이 갖게 되는 몇 단점들이 있습니다.

바로 초기화작업으로 인한 느린 생성과 객체 참조 시의 어쩔 수 없는 오버헤드입니다.
(물론 이는 앞으로 보여줄 스택기반배열에대한 상대적인 비교입니다.)
사실 위와같이 일반 배열을 사용해도 보통 크게 문제될건 없지만,
어마어마한 반복작업탓에 약간의 오버헤드도 큰 문제를 야기할수 있는 때에
System.Array의 인스턴스가 아닌
unsafe
{
        //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;
}
와 같이 할당된 영역이 아닌 전혀 엉뚱한 영역을 접근하여
심각한 데이타 파괴를 야기할수도 있기 때문입니다.
[홀개발자의 작업이라면 몰라도, 다른 개발자들이 깜빡 실수를 할수도 있거든요.(고의라던가..)]

PS : System.Array의 인스턴스라는 이야기에
(자주 사용하시는)ArrayList를 사용할때처럼 new 키워드로 인스턴스화 하시려는 분이 계신데,
System.Arrayabstract가 붙어있는 추상 클래스이고
인스턴스를 생성하기위해선 CreateInstance라는 메서드를 사용해야합니다.
*인자는 배열의 타입과 크기를 받습니다.
(추상 클래스는 .NET 2.0부터 추가된 static이 붙는 정적 클래스처럼 인스턴스화가 되지 않는 특성을 가지고 있습니다.)
--------------------------------------------------

기분이 나면 언어 스펙부터 차근차근 써보도록 하겠습니다.
출저는 http://geekproject.net/ (제 블로그)입니다. 저좀 많이 사랑해주세요^^ [하악하악]
번호 제목 글쓴이 날짜 조회 수
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] file 케이코냥이 2006.09.03 166
26 한국 위키백과를 추천합니다. MrGeek 2006.09.01 84
25 1. DirectX 8.0 sdk 해보기. file 케이코냥이 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