실행파일 크기

KWANHO PARK·2025년 10월 21일

실행파일 크기를 줄이기 위해 데이터 영역과 BSS 영역이 구분되어 있다고 알고 있다.

데이터 영역과 BSS 영역에 데이터를 집어넣고 .exe 파일 크기를 비교해보자

// sizeTest.c
#include <stdio.h>

int arr[1000];

int main()
{
	
	return 0;
}
// sizeTest1.c
#include <stdio.h>

int arr[1000] = {1, 2,};

int main()
{
	
	return 0;
}
// sizeTest2.c
#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의 크기가 어떻게 될까?

// sizeTest3.c
#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인 것을 확인할 수 있다

이유

  • 어차피 컴파일 단계에서는 런타임에 배열 공간을 할당하라는 코드만 추가되기 때문에 실행파일의 크기가 배열 크기만큼 커질 일이 없다.

0개의 댓글