소스파일, 목적파일, 실행파일 크기와 관련해서 궁금한게 있습니다.
a.c 파일이
#include <stdio.h> int main(void) { printf("AA\n"); }
이렇게 있다고 가정하고요.
#include <string.h>, #include <stdlib.h>
등등 을 선언하면
a.c 소스파일 크기가 커지잔아요.
근데 컴파일을 했다고 가정하면.,,
a.obj 파일일 경우
#include <stdio.h> #include <string.h> int main(void) { printf("AA\n"); }
인 경우는 a.obj 파일 크기가 증가하는데
////////////////////////////////////////////////////////////
#include <stdio.h> #include <stdlib.h> int main(void) { printf("AA\n"); }
인 경우는 a.obj 파일 크기가 증가하지 않습니다.
제 생각에는 둘 다 a.obj파일 크기가 증가 하지 않아야 한다고 생각하는데..
해당 헤더파일에서 가져온 함수가 없잔아요.
실행파일 (a.exe)는 두 경우 모두 파일 크기가 증가하지 않습니다...
---------------------------------------------------------------------------
#include <stdio.h> static a=10; b=11; int main(void) { printf("AA\n"); }
또한 static 변수, 전역변수 유무에 따라 실행파일, 목적파일 크기가 커질줄 알았는데..
전역변수, static변수를 선언해도 a.obj파일 크기는 증가하지만 실행파일인 a.exe는 증가하지 않더라구요.
---------------------------------------------------------------------------
최종 실행파일(a.exe)은 어떠한 경우가 크기가 커지는 건가요?
제가 그동안 큰 착각을 한건지...
실행되는 코드 길이가 길어진다고해서 실행파일이 커지지 않더라구요.
여러 변수들도 선언해보고 해봤는데.. 파일 크기는 변화가 없더라구요.
---------------------------------------------------------------------------
테트리스게임도 프로젝트 크기는 35MB인데.. 실행파일은 74KB?? 밖에 안되더라구요..
제가 뭔가 큰 착각을 하고 있는 건지.. 혼란스럽습니다.
최종적으로 만들어지는 실행파일의 크기가 결국 그 파일을 실행할 때, 메모리에 올라오는 파일 크기 아닌가요???
source file(a.c) 소스파일 -> object file(a.obj) 목적파일 -> execute file(a.exe) 실행파일
잔아요->잖아요 동적 링크, 정적 링크의 관계를
잔아요->잖아요
동적 링크, 정적 링크의 관계를 공부해 보세요.
맞춤법 죄송합니다.
맞춤법 죄송합니다.
저 부분에 대해서는 어느정도 알고는 있습니다.
string.h, stdlib.h 같은 경우 정적링크로 링크 단계에서 연결되지 않습니까?
동적링크인 경우 실행파일 크기가 증가하지 않지만..
string.h, stdlib.h 인 경우는 정적 링크인 것으로 알고 있습니다. 그러므로 링커 단계에서 붙어지므로
해당 라이브러리의 함수들을 사용하면 실행파일이 커질거라 생각했습니다.
위 글의 소스파일에서는 해당 함수들을 사용하지 않았지만 strlen함수를 사용해봐도 실행파일 크기는 변하지 않습니다.
또한 정적 변수 같은 경우는 해당 소스파일에서 사용하는 것인데.. 분명 데이터 영역에서 파일 크기가 증가하므로 실행파일도 커져야 하는데
커지지 않습니다.
IDE는 비쥬얼 스튜디오입니다.
프로젝트명\DEBUG\a.exe
인 파일이 실행파일 맞지 않습니까....
저도 나름 열심히 찾아본건데.. 해결이 안되서 질문을 올렸습니다. 죄송합니다.
저도 잘은 모르지만 마이크로소프트 제품들이 대부분
저도 잘은 모르지만 마이크로소프트 제품들이 대부분 사용자의 편의를 위해 자기 마음대로 동작하는 부분이 많아서 이런 문제를 연구하고 싶으시다면 다른 플랫폼을 쓰시는게 좋습니다.(아마도 리눅스가 제일 좋겠죠?)
또 리눅스 커뮤니티에 마이크로소프트 질문을 올리면 혼란을 초래할수 밖에 없겠죠.
* 포럼 주제와 무관한 신변잡기를 반복해서 올리지 맙시다.
* 질문 게시판 만이라도 익명 글쓰기를 막아야 한다고 생각합니다.
답변 감사합니다.
좋은 말씀 감사합니다..
리눅스로 테스트 해본 결과..
파일 크기가 변하지 않습니다. ㅠㅠ
1: string.h include 하지 않음.
2: strlen 함수 비호출
3: strlen 함수 호출
따른 컴파일 결과입니다..
오브젝트 파일 전의 어셈 파일을 뽑아서 비교해 보시길
오브젝트 파일 전의 어셈 파일을 뽑아서 비교해 보시길 권합니다.
그럼 어떻게 처리했는지 더 확실하게 보일 겁니다.
그리고, 씨 언어도 고급 언어인지라 의미 기준으로 결과물이 나옵니다.
이 말은, 컴파일러가 극단적으로 최적화를 시킬 수 있다는 뜻입니다.
쓰이지 않는 변수를 빼는건 당연하고, 루프를 풀거나 없애고,
대입문을 간소화 하는 등 생각하기 어려운 부분들이 많이 있습니다.
어셈 파일이나 오브젝트 파일 같이 중간 단계의 파일 뽑아서 비교해 보시는게 제일 확실합니다.
그리고 위의 리눅스 vs 마소 같은 헛소리는 무시하세요.
옛날이나 지금이나 마소 관련 주제도 잘만 다루었고,
못할 질문도 아닙니다.
그리고 마소가 멋대로 하는 부분이 많긴 한데 이
그리고 마소가 멋대로 하는 부분이 많긴 한데
이 주제에 대해서만은 핵심 포인트가 아닙니다.
질문 게시판에 익명 욕이 많아서 답답하네요
질문 게시판에 익명 욕이 많아서 답답하네요
* 포럼 주제와 무관한 신변잡기를 반복해서 올리지 맙시다.
* 질문 게시판 만이라도 익명 글쓰기를 막아야 한다고 생각합니다.
헛소리를 헛소리라고 한 것은 그냥 사실을 말한거지
헛소리를 헛소리라고 한 것은 그냥 사실을 말한거지 욕이 아닙니다.
내가 님의 답변을 가지고 님이란 인간 자체를 비난하거나
욕을 하고자 했다면 '헛소리'라는 표현 정도로 끝내진 않았을 겁니다.
소스 코드를 어떻게 컴파일할지, 그 크기를 어떻게 할지, 어떤 라이브러리들을 실행파일에 포함시킬지는
표준에 포함된 바 없습니다.
오히려, 아예 표준에서는 결과만 맞으면 그 과정에는 상당한 재량을 부여하고 있습니다.
물론 MS가 멋대로 하는 부분이 꽤 많긴 합니다. 그러나 위 질문은 그것과는 별개입니다.
그리고 a.obj에 a.exe라고 했으면 사실 gcc가 아닌 것 정도는 어느정도 파악할 수 있습니다.
프로그래밍 qna에 OS 가리지 않고 종합적으로 질문 들어오는게 벌써 십년도 넘은 일인데
리눅스 커뮤니티에 마소 관련 질문 올려서 혼란을 초래한다는 있지도 않던 관습법을 말하시면 곤란합니다.
질문자에게 도움이 되는 내용도 아니고, 오히려 오해를 불러 일으키고,
거기에 있지도 않던 관습을 들먹이며 마치 저런 질문을 올리는 것 자체가 잘못인 양 압박하고...
이러니 헛소리가 아니면 대체 뭡니까?
exe의 사이즈는 compiler마다,
exe의 사이즈는 compiler마다, oompiler 옵션마다 다르게 나올 것입니다.
- 옛날에 써봐서 기억이 정확하진 않지만 VS에서 컴파일시 DEBUG와 release로 컴파일했을 때 실행파일의 크기가 달랐던것으로 기억합니다.
gcc를 예를 들면 같은 소스도 옵션마다 크기가 다르게 나옵니다. (-Os 가 size최적화 입니다.)
https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Optimize-Options.html#Optimize%20Options
위에 확인하신 결과에 대해 정확하지 않지만 제가 생각한 실행파일이 크기가 변하는 이유중 한가지를 이야기 해 드린다면
- 크기가 같은건 속도를 위해서 allin을 맞추다 보니 크기가 같아질수가 있습니다.
- 크기가 달라지는건 컴파일러마다 metadata의 저장 방법 및 저장 유무가 달라지는데 그게 차이나서 그런것일 것입니다.(이건 위에분중에 이야기 해주신분이 있네요)
정적 라이브러리 추가되면 그 라이브러리 때문에 커지는
정적 라이브러리 추가되면 그 라이브러리 때문에 커지는 경우도 있습니다.
Written By the Black Knight of Destruction
댓글 달기