배열 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에 대한 지수 계산의 일부
- 참조 증가 포인터
- 컴파일러는 포인터를 수동으로 사용하는 것과 동일한 효과를 얻을 수 있다.
- 유도변수 제거
- 프로그램을 더 명확하고 안전하게 만드는 것이 더 좋다.
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 17. 부동 소수점 (1) | 2023.10.15 |
---|---|
[컴퓨터시스템구조] 16. 컴퓨터 산술(mult, mfhi, mflo, mul, div) (0) | 2023.10.15 |
[컴퓨터시스템구조] 14. MIPS Sort (1) | 2023.10.15 |
[컴퓨터시스템구조] 13. MIPS 동기화 (0) | 2023.10.15 |
[컴퓨터시스템구조] 12. MIPS 주소지정 정리 (0) | 2023.10.14 |
배열 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에 대한 지수 계산의 일부
- 참조 증가 포인터
- 컴파일러는 포인터를 수동으로 사용하는 것과 동일한 효과를 얻을 수 있다.
- 유도변수 제거
- 프로그램을 더 명확하고 안전하게 만드는 것이 더 좋다.
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 17. 부동 소수점 (1) | 2023.10.15 |
---|---|
[컴퓨터시스템구조] 16. 컴퓨터 산술(mult, mfhi, mflo, mul, div) (0) | 2023.10.15 |
[컴퓨터시스템구조] 14. MIPS Sort (1) | 2023.10.15 |
[컴퓨터시스템구조] 13. MIPS 동기화 (0) | 2023.10.15 |
[컴퓨터시스템구조] 12. MIPS 주소지정 정리 (0) | 2023.10.14 |