네이티브 데이타 타입 - 워드 크기의 정수형
워드 - 컴퓨터 구조에서 하나의 연산으로 메모리에서 레지스터로 전송할 수 있는 데이터의 단위
(예-32bit 컴은 1word 32bit) 1word는 레지스터 크기와 같고, 데이터 버스의 폭과 같다.
이러한 이유 때문에 어셈블리 레벨에서는 네이티브 데이터 타입을 사용했을 때 가장 적은 인스트럭션을 사용한다.
데이터 버스는 데이터가 이동하는 통로이므로 데이터 버스의 폭은 프로세서에서 데이터를 한 번에 읽어오는 양과 직접적인 관계가 있다. 32bit 프로세서의 경우 double 형의 데이터를 메모리에서 읽어 오려면 4byte로 두번 메모리 엑세스 해야되고. char의 경우는 1번 엑세스 하지만. 1바이트의 데이터를 추려내는 마스킹 연산이 추가된다.
변수 데이터의 사용 규칙
- 가능하면 네이티브 데이터 타입을 써라
- 변수의 범위 안에 포함되는 가장 작은 데이터 타입을 써라
- 부동 소수점을 피하라 -> 되도록 정수를 사용, 소수점이 필요한 경우에는 고정 소수점을 사용
(부동소수점(부동소숫점)(浮動小數點)[1] 방식은 실수를 표현할 때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것..예-> (가수)×(밑수)(지수) , -0.04E+1)
(고정소수점은 소수점을 사용하여 정확한 소수를 나타내는 것이다, // 머지?
http://www-inst.eecs.berkeley.edu/~cs61c/sp06/handout/fixedpt.html)
전역 변수는 레지스터에 할당할 수 없으므로 함수나 루프에서 사용하지 않는 것이 좋다. 함수나 루프에서 변수를 사용할 때마다 외부에서 읽어와야 하기 때문이다. 함수나 루프에서 전역 변수를 써야 한다면, 지역 변수에 복사하여 사용하는 것이 좋다.
int global_var;
void f1(){
int i;
for(i=0;i<100;i++){
if(f2())
global_var++;
}
}
이 경우 루프 안에서 전역 변수를 사용하므로 외부 메모리 엑세스가 반복적으로 일어난다. 값만 지역변수로 복사하고 루프를 돌면 레지스터를 사용하므로 속도를 높일 수 있다.
register unsigned int ;
레지스터는 주소가 업삳. 레지스터 주소를 읽어오려고 하면, 주소가 없기 때문에 값을 스택에 복사한 후 스택의 주소를 넘겨준다.
const
#define 으로 선언한 상수는 값이 대치된다. const로 만든 상수는 데이타 타입을 갖는다. 유의할 점은 배열의 크기 값으로 사용할 수 없다는 점. consts는 완벽한 상수가 아니므로 컴파일 시에 값이 보이지 않기 때문이다. (이건 걍 const가 아니더라도 마찬가지. 지역 변수 배열의 경우는 상관없지만 전역의 경우는 안됨)
이건 가능
int main(void)
{
int b =10;
int c[b];
return 0;
}
이건 불가능
int b =10;
int c[b];
int main(void)
{
return 0;
}
const 키워드는 위치에 따라서 역할이 조금씩 달라진다. const는 앞의 단어를 수식한다.
1. const int *p_a; //2번과 같은 의미, 맨 앞에 있을 경우에는 기본 데이터 타입. 여기서는 int를 수식하여 값 변경x
2. int const *p_b; //값을 변경하지 못하게
3. int * const p_c; //주소값을 변경 못하게
4. int const * const p_d; //값, 주소 다 변경 못함.할라하면 에러발생
예제를 만들어서 해볼라고 했는데 3,4는 컴파일 안됨
const int *p_a;
int const *p_b;
int main(void)
{
int a;
p_a = &a;
p_b = &a;
//*p_a = 10; //assignment of read-only location
//*p_b = 10; //assignment of read-only location
return 0;
}
'컴퓨터 과학 & 영상처리 관련 > 임베디드' 카테고리의 다른 글
함수, 생각없이 쓰면 낭패본다. (0) | 2012.06.05 |
---|---|
집합원소 저장의 효율적 방법 (0) | 2012.06.04 |
c는 메모리를 어떻게 사용하는가 (0) | 2012.06.02 |
gcc 컴파일 설정 (0) | 2012.05.29 |
ARM과 인텔의 경우 arg갯수에 따라 load/store 명령을 하기도함 (0) | 2012.05.27 |