본문 바로가기
C 언어

타입 캐스팅을 활용해서 성능 개선하기

by Best Coding 2023. 8. 13.
반응형

 

 

C언어 타입 캐스팅

 

 

이번 글에서는 타입 캐스팅을 활용해서 코드 실행시간을 단축시키는 스킬에 대해서 알아보도록 하겠습니다. 

 

1억개의 char형 배열을 0으로 초기화해야하는 상황이라고 가정하겠습니다. 보통 아래 코드 처럼 1억개의 원소를 하나하나 초기화 하는 방식으로 구현할 것입니다. 

#include<stdio.h>
#include<time.h>
char arr[100000001];
int main(void) {
	clock_t start = clock();
	for (int i = 0; i < 100000000; ++i) {	//1억개 배열 초기화
		arr[i] = 0;
	}
	clock_t end = clock();
	printf("소요시간 : %d\n", end - start);	//ms단위
	return 0;
}

이 코드를 실행시켜보면 제 컴퓨터 환경에서는 약 250ms 정도가 걸립니다.  타입 캐스팅을 활용하면 약 75ms로 실행시간을 단축시킬 수 있습니다.

 

반응형

(1) 핵심 아이디어

  • char 자료형 = 1 byte
  • long long 자료형 = 8 byte
  • 같은 배열의 원소들의 주소는 연속적이다.
  • 포인터 형 변환이 가능하다.

위 아이디어들을 바탕으로 생각해보면 char형 배열을 long long형 배열인 것 처럼 보는 것도 가능할 것 같습니다. 즉 1억개의 char형 배열을 초기화 했었는데, long long 형인것 처럼 배열을 본다면, 1250만 개의 long long형 배열만 초기화 해주면 됩니다. 

 

그림으로 표현해보면 아래와 같습니다.

char형 배열을 long long 타입의 배열인 것 처럼 볼 수 있다.

char 형 배열 arr을 long long 포인터 형으로 캐스팅 했습니다. 기존에는 24개의 원소로 표현했던 것을 3개의 원소로 표현할 수 있는 것을 확인 할 수 있습니다.

 

 

(2) 코드

전체 코드 입니다. 대략적으로 75ms 정도 걸립니다.

#include<stdio.h>
#include<time.h>
char arr[100000001];
int main(void) {
	clock_t start = clock();
	long long* ptr = ((long long*)arr);
	for (int i = 0; i < 12500000; ++i) {	//1250만 개 배열 초기화
		ptr[i] = 0LL;
	}
	clock_t end = clock();
	printf("소요시간 : %d\n", end - start);	//ms단위
	return 0;
}

 

(3) 주의사항

1) 포인터형 타입 캐스팅 시 원본에 unsigned가 붙어있으면 캐스팅 할 때도 unsigned가 붙어있는 타입으로 캐스팅 해줘야 합니다!! 왜냐하면 unsigned 유뮤에 따라서 최상위 비트를 활용하는 방식이 다르기 때문입니다.

	unsigned char brr[10000];
	unsigned long long* ptr2 = ((unsigned long long*)brr);

	char crr[10000];
	long long* ptr3 = ((long long*)crr);

 

 

2) long long으로 캐스팅 했을 때  char 원소의 순서가 예상과는 다릅니다. 위 예시의 경우 ptr[0]의 가장 왼쪽이 arr[0] 가장 오른쪽이 arr[7]이 될 것 같다고 예상할 수 있습니다. 하지만 실제로 확인해보면 그렇지 않습니다. 가장 오른쪽이 arr[0]이고 가장 왼 쪽이 arr[7]인 것을 확인할 수 있습니다. 그래서 아래 그림처럼 표현된 것입니다.

 

 

반응형

댓글