루프를 이용한 배열 엑세스
for(i=0;i<10;i++) { a[i]=i+1; } 이경우 i접근과 반복조건 테스팅에 시간이 많이 걸림. 가독성은 좋다. |
인덱스 증감을 이용한 배열 엑세스
i = 0; a[i++]=k*PI; a[i++]=l*PI; a[i]=3*PI;
배열은 속도가 빠름. 루프의 반복적 오버헤드도 없고. 주소의 오프셋만 계산되므로 비용 줄일 수 있음. |
하드 코드 배열 엑세스
a[0] = k*PI; a[1] = l* PI; a[2] = 3* PI;
각 요소의 주소가 컴파일 시에 계산되기 때문에 시작주소와 오프셋 계산 필요 없음 |
포인터를 이용한 배열 엑세스
int a[5], *p; p = a; *p = k*PI; *(p+1) = 1*PI; *(p+2) = 3*PI;
포인터 주소에 접근한 다음에 데이터에 접근하게 됨. 간접 접근 방식. 메모리 엑세스 2번. 비효율적. 그리고 코드를 이해하기도 어렵다. 무엇보다 배열과 같이 인덱스를 사용하지 않기 때문에 메모리의 유효 범위 검사가 어렵다. 컴파일시 에러도 안나서 정말 큰 문제. |
배열 인덱스의 활용
예제_1 static char *buf = "abc"; text = buf[choose];
예제_2 void (*p[3])() = {f1,f2,f3}; p[choose]();
|
자료형 별 align
1. char 어느 주소나 가능(.align 0인듯)
2. short 2의 배수 주소(.align 1인듯..2의 배수니깐)
3. int 4의 배수 주소(.align 2인듯...4의 배수니깐)
배열의 속도 측면에서, 포인터는 메모리 측면에서 유리.
union으로 endian 모드 다를 경우 유용하게 쓰는법
union Test{ int x; char y[4]; };
void main(){ char buf[4]; int i; union Test t1; t1.x = 10; for(i=3;i>=0;i--) buf[3-i] = t1.y[i]; send(buf); }
이 소스에서는 일단 x로 일반적으로 집어넣고 가져다가 쓸때 역순으로 빼왔음..오..되게 신기하네 |
'컴퓨터 과학 & 영상처리 관련 > 임베디드' 카테고리의 다른 글
메모리는 돈이다 (0) | 2012.06.05 |
---|---|
함수, 생각없이 쓰면 낭패본다. (0) | 2012.06.05 |
변수를 잘 사용하는 건 최적화의 기본 (0) | 2012.06.03 |
c는 메모리를 어떻게 사용하는가 (0) | 2012.06.02 |
gcc 컴파일 설정 (0) | 2012.05.29 |