이번 글에서는 타입 캐스팅을 활용해서 코드 실행시간을 단축시키는 스킬에 대해서 알아보도록 하겠습니다.
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 형 배열 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]인 것을 확인할 수 있습니다. 그래서 아래 그림처럼 표현된 것입니다.
'C 언어' 카테고리의 다른 글
C언어 매크로(Macro)의 모든 것 - #define, 개념, 동작원리, 성능, 장점, 다양한 예시, 주의사항 (0) | 2024.12.22 |
---|---|
비트연산 - 코딩테스트 시간단축을 위한 마법 (1) | 2024.12.22 |
C언어 비트연산 완벽 정리 - 장점, 원리, 사용 예시, 예제코드 (2) | 2024.12.22 |
C언어 char 타입과 ASCII 코드 완벽 이해 - 전체 아스키 코드 표, 대소문자 변환 (2) | 2024.12.21 |
C 언어의 모든 데이터 타입: 범위, 메모리 크기, 개념 완벽 정리 (0) | 2024.12.21 |
댓글