본문 바로가기
컴퓨터시스템구조

[컴퓨터시스템구조] 15. MIPS 배열 vs. 포인터

by 파스텔코랄 2023. 10. 15.

배열 vs. 포인터

  • 배열 인덱싱
    • 찾으려면 요소 크기에 인덱스를 곱해야한다.
    • 배열 기본 주소에 추가
  • 포인터는 메모리 주소에 직접적으로 대응한다.
    • 인덱싱 복잡성을 피할 수 있다.

 


 

배열

  • C 코드
clear1(int array[], int size) {
    int i;
    for (i = 0; i < size; i += 1)
        array[i] = 0;
}
  • i : $t0
  • array 주소 : $a0
  • size : $a1

 

  • MIPS 코드
    move $t0, $zero             # i=0
loop1:
    sll $t1, $t0, 2                   # $t1=i*4
    add $t2, $a0, $t1            # $t2=&array[i]
    sw $zero, 0($t2)              # array[i]=0
    addi $t0, $t0, 1                # i+=1
    slt $t3, $t0, $a1               # i<size 참이면 $t3=1
    bne $t3, $zero, loop1

 


 

포인터 배열

  • C 코드
clear2(int *array, int size) {
    int *p;
    for (p = &array[0]; p < &array[size]; p = p + 1)
        *p = 0;
}
  • p : $t0
  • array 주소 : $a0
  • size : $a1

 

  • MIPS 코드
    move $t0, $a0                # p=&array[0]
    sll $t1, $a1, 2                  # $t1=size*4
    add $t2, $a0, $t1            # $t2=&array[size]
loop2:
    sw $zero, 0($t0)              # Memory[p]=0
    addi $t0, $t0, 4                # p+=4
    slt $t3, $t0, $t2                # p<&array[size] 참이면 $t3=1
    bne $t3, $zero, loop2

 


 

  • 루프문 안에서 배열 명령이 6개 반복되고, 포인터 배열4개 반복된다.
    • 일반적으로 포인터로 짠게 더 효율적이다.

 


 

배열 vs. 포인터 비교

  • 배열에서는 루프 내부로 이동해야 한다.
    • 증가된 i에 대한 지수 계산의 일부
    • 참조 증가 포인터
  • 컴파일러는 포인터를 수동으로 사용하는 것과 동일한 효과를 얻을 수 있다.
    • 유도변수 제거
    • 프로그램을 더 명확하고 안전하게 만드는 것이 더 좋다.

댓글