ecsimsw
Array vs Pointer. MIPS aspect 본문
1. 포인터는 변수이고 배열 명은 상수이다. 포인터는 다른 주소를 가리킬 수 있지만 배열 명은 오직 배열의 시작 주소만을 가리킨다.
2. 포인터로 메모리를 할당하여 동적인 크기의 배열을 선언할 수 있고, 조절할 수 있다. 반면 배열은 정적인 크기로 선언되어 크기가 변할 수 없다.
3. 포인터 변수의 크기는 4바이트 (32비트 컴퓨터), 8바이트 (64비트 컴퓨터) 이지만 배열 명을 sizeof 할 시 배열의 전체 크기를 구할 수 있다.
4. delete, delete[]를 선호해야하는 이유는 크기를 지정하는 것이 더 안전하기 때문과, delete[]을 이용해야 소멸시키는 객체만큼의 소멸자를 호출하기 때문이다.
추가적으로 포인터에 할당한 메모리를 delete 하는 것과 포인터 변수의 값은 관련이 없다. delete는 해당 메모리 영역을 사용가능하도록 만들어주는 것이지 포인터의 값을 null로 만드는 것이 아니다.
5. 인덱스를 계산해줘야하는 배열보다 포인터로 직접 연산하는 것이 빠르다.
아래 mips 코드로 보면 loop안에 명령 수가 포인터를 이용한 반복이 2개 적은 것을 확인할 수 있다.
Array(int array[], int size){ int i; for(int i=0; i<size; i++){ array[i]=0; } }
mov t0 zero loop:: sll t1 t0 2 add t2 t1 a0 sw zero t2 add to to 1 slt t3 t0 a1 bne t3 zero loop::
|
Pointer(int *array, int size){ int *p; for(p= array; p<array[size]; p++){ *p=0; } }
mov t0 a0 sll t1 a1 2 add t2 a1 t1 loop:: sw zero t0 add to to 4 stl t3 t0 t2 bne t3 zero loop::
|
'Language > C++, C#' 카테고리의 다른 글
OOP / Duck typing / 덕 타이핑 (0) | 2019.05.07 |
---|---|
Dynamic allocated array (0) | 2019.05.05 |
Explicit (0) | 2019.04.23 |
static_cast / reinterpret_cast (0) | 2019.04.23 |
Function pointer / 함수 포인터 (0) | 2019.04.20 |