실행파일 크기를 줄이기 위해 데이터 영역과 BSS 영역이 구분되어 있다고 알고 있다.
데이터 영역과 BSS 영역에 데이터를 집어넣고 .exe 파일 크기를 비교해보자
#include <stdio.h>
int arr[1000];
int main()
{
return 0;
}
#include <stdio.h>
int arr[1000] = {1, 2,};
int main()
{
return 0;
}
#include <stdio.h>
int arr[1000];
int main()
{
for (int i = 0; i < 1000; i++)
{
arr[i] = i;
}
return 0;
}
- 위 3개의 소스코드 컴파일 후 .exe파일 확인

분석
- sizeTest1.exe - 92kb
- sizeTest.exe, sizeTest2.exe - 88kb
sizeTest1.c에서는 전역으로 선언한 배열을 초기화했으므로 배열이 데이터 영역에 위치하고, sizeTest.c와 sizeTest2.c의 경우에는 BSS 영역에 위치한다.
- 우선 sizeTest1.c의 배열은 1, 2가 들어가있고, C 표준에 따라 나머지 빈 배열공간에는 0으로 자동 초기화 되어 1, 2와 0 998개가 들어간 배열이 저장된다.
- 즉 1000개의 정수값이 실행파일에 들어가게 된다.
- 반면, BSS영역에 들어가는 배열은 실행파일에 0 1000개가 직접 저장되는 것이 아니라 프로그램 시작 정수 1000개가 들어갈 공간을 확보하고 0으로 채우라는 코드만 기록된다.
그래서 sizeTest1.exe가 sizeTest.exe와 sizeTest2.exe보다 정수 1000개 크기(4byte * 1000 = 4000 => 4kb)만큼 더 큰 것이다.
- sizeTest2.c는 main함수 내에서 배열에 값을 할당해주고 있는데, 어차피 런타임에 for문이 실행되면서 BSS에 0으로 채워진 값들이 할당해준 값으로 변경되기 때문에 .exe 파일 크기에는 영향을 미치지 않는다.
그럼 크기가 큰 배열 여러 개가 BSS 영역에 위치하게 되면 .exe의 크기가 어떻게 될까?
#include <stdio.h>
int arr[1000];
int arr1[1000];
int arr2[1000];
int arr3[1000];
int arr4[1000];
int arr5[1000];
int arr6[1000];
int arr7[1000];
int main()
{
return 0;
}
-
결과

-
똑같이 88kb인 것을 확인할 수 있다
이유
- 어차피 컴파일 단계에서는 런타임에 배열 공간을 할당하라는 코드만 추가되기 때문에 실행파일의 크기가 배열 크기만큼 커질 일이 없다.