ecsimsw

Array vs Pointer. MIPS aspect 본문

Array vs Pointer. MIPS aspect

JinHwan Kim 2019. 6. 27. 17:13

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
Comments