제 8강) 변수에 대한 추가적인 이야기 |
사실 이 이야기는 "초보자를 위한 C언어 강좌"라는 이름에 조금은 어울리지 않을 수도 있습니다만 기초를 탄탄히 해야 좋다고 생각하기 때문에 쓰려고합니다.
CPU와 OS에 최적화된 변수(Integer) |
C언어은 "로우 레벨" 프로그래밍(어셈블리어 사용)이 가능합니다.
자바와는 다르게 직접 어셈블리어를 사용하여 프로그래밍이 가능하죠.
이 C언어에서 쓰이는 "int"라는 정수를 뜻하는 변수는 "CPU가 선호하는 자료형" 입니다.
CPU에는 ALU라는 "산술 논리 장치"라는 것이 있습니다. 산술연산과 논리연산을 CPU에서 담당하고 있는 건데요.
이 ALU가 int 단위로 데이터를 처리하게 됩니다.
그래서 "CPU가 선호 하는 자료형"이라고 합니다.
이러한 이유로 char형이나 short형은 int형으로 가져와서 각각의 형의 크기로 쪼개서 만들어지게 됩니다.
메모리에 변수가 선언되면 |
각각의 변수는 개개인의 크기를 가지고 메모리상에 생성이 됩니다.
이렇게 개개인의 크기를 가지고 생성됩니다.
그 어떤 값을 갖던 간에 char는 1바이트, short는 2바이트, int는 4바이트의 크기를 가지고 생성되죠.
이렇게 생성된 데이터는 각각 알맞게 "스택 영역", "데이터 영역", "힙 영역(동적 데이터)"에 넣어지게 됩니다.
이 영역에 대해서는 "전역변수", "동적메모리 할당"을 배운 뒤에 다시 알아보도록 합시다.
정수의 승격(Integer Promotion) |
"승격"이라는 단어를 안들어보신 분들도 계실것같습니다.
(출처 : 네이버 사전)
승격은 위와 같은 뜻이 있습니다.
즉, "레벨업!!"이라는 것이지요.
이 승격이 C언어 상에서도 일어납니다.
short num1 = 4;
short num2 = 14;
short result = num1 + num2; // 여기서 자동으로 num1과 num2가 int로 바뀌어 계산이 됩니다.
이렇게 short로 선언된 변수가 계산을 할때는 "short + short"가 아닌 "int + int"로 바뀌어 계산이 됩니다.
(char형도 int + int로 바뀝니다.)
더 자세한 내용은 "C언어 표준안(ISO/IEC 9899:1999 - TC3)" 의 "5.1.2.3.10"번 항목을 보시면 됩니다.
(출처 : Open-STD ISO/IEC 9899:1999 5.1.2.3.10)
즉, short나 char형은 int형으로 승격되어 계산이 됩니다.
계산 속도는 int가 빠르다?(char, short에 비해) |
바로 앞앞에서 CPU가 선호하는 자료형이 "int"라고 했습니다.
그럼 계산속도도 int가 제일 빠를까요?
총 5번 반복하여 테스트를 했습니다.
50과 60을 더하는 연산을 총 30,000,000번 반복하는 테스트를 했습니다.
전부 int 계산이 가장 높은 것을 알 수 있습니다.
그런데...
위의 테스트는 일반적인 "x86 디버거" 즉, 32비트 디버거에서 테스트 되었습니다.
그럼 이것이 64bit 디버거에 실행되어도 똑같은 결과를 보일까요?
결과로 보시면 int가 제일 느리다는 것을 알 수 있는데요.
사실 이 부분에 대해서는 저도 잘 모르겠습니다.
검색을 해봐도 안나오고... 배운적이 없어서 사실상 잘 모르겠습니다...
(이 부분에 대해서는 추가적으로 알게되면 쓰겠습니다.)
(아마 int 자료형의 크기가 커지면서 느려지는 것 같습니다.)
테스트에 쓰인 코드 |
#include <stdio.h>
#include <time.h> // time_h 자료형과 clock()함수를 위함
#define MAX 30000000 // 각 자료형의 계산 횟수
#define A 50 // 자료형 계산에 쓰일 변수1
#define B 60 // 자료형 계산에 쓰일 변수2
int main(void)
{
// 총 5번의 테스트 반복
for (int i = 0; i < 5; i++)
{
printf("자료형 계산 시간 테스트\n");
printf("숫자1 : %d, 숫자2 : %d, 반복횟수 : %d \n", A, B, MAX);
int num_i1 = A, num_i2 = B;
int num_iresult;
time_t startTime = clock(); // 테스트 시작 시간
for (int i = 0; i < MAX; i++)
{
num_iresult = num_i1 + num_i2;
}
time_t endTime = clock(); // 테스트 종료 시간
printf("int 계산 걸린 시간 : %fs \n", (float)(endTime - startTime) / CLOCKS_PER_SEC);
// 테스트 시간을 time_t에서 float형으로 강제 형변환 후 1초 단위로 변환
// (강제 형변환은 나중에 배워봅시다.)
short num_s1 = A, num_s2 = B;
short num_sresult;
startTime = clock();
for (int i = 0; i < MAX; i++)
{
num_sresult = num_s1 + num_s2;
}
endTime = clock();
printf("short 계산 걸린 시간 : %fs \n", (float)(endTime - startTime) / CLOCKS_PER_SEC);
char num_c1 = A, num_c2 = B;
char num_cresult;
startTime = clock();
for (int i = 0; i < MAX; i++)
{
num_cresult = num_c1 + num_c2;
}
endTime = clock();
printf("char 계산 걸린 시간 : %fs \n", (float)(endTime - startTime) / CLOCKS_PER_SEC);
printf("\n");
}
return 0;
}
다음시간에는 |
다음 시간에는 "주석"과 "상수"로 만나뵙겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 09 [주석과 상수] (0) | 2018.10.17 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 10 [연산자 이야기] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 07 [입력문과 출력문(printf, scanf, scanf_s)] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 06 [자료형2] (0) | 2018.07.08 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 05 [자료형1] (0) | 2018.07.08 |