그의 FAQ에서 Bjarne Stroustrup은 gcc -O2로 컴파일 할 때 C와 C++를 사용하는 hello world의 파일 크기가 동일하다고 말합니다.C++ Hello World 바이너리가 동등한 C 바이너리보다 큰 이유는 무엇입니까?
는참고 :이 시도하기로 결정 http://www.stroustrup.com/bs_faq.html#Hello-world
, 여기에 C 버전입니다 :
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello world!\n");
return 0;
}
그리고 여기에 여기에 내가 컴파일하고 크기를 C++ 버전
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Hello world!\n";
return 0;
}
입니다 다른 :
[email protected]:~/hello$ ls
hello.c hello.cpp
[email protected]:~/hello$ gcc -O2 hello.c -o c.out
[email protected]:~/hello$ g++ -O2 hello.cpp -o cpp.out
[email protected]:~/hello$ ls -l
total 32
-rwxr-xr-x 1 r00t r00t 8559 Sep 1 18:00 c.out
-rwxr-xr-x 1 r00t r00t 8938 Sep 1 18:01 cpp.out
-rw-r--r-- 1 r00t r00t 95 Sep 1 17:59 hello.c
-rw-r--r-- 1 r00t r00t 117 Sep 1 17:59 hello.cpp
[email protected]:~/hello$ size c.out cpp.out
text data bss dec hex filename
1191 560 8 1759 6df c.out
1865 608 280 2753 ac1 cpp.out
std::endl
을 \n
으로 바꿨고 이진을 더 작게 만들었습니다. 나는이 단순한 것이 인라인 될 것이라고 생각했다. 그리고 dissapointed하지 않았다.
최적화 된 어셈블리에는 수백 줄의 어셈블리 출력이 있습니까? sys_write를 사용하여 5 개의 어셈블리 명령어를 사용하여 hello world를 작성할 수 있습니다. 모든 추가 작업에는 어떤 것이 있습니까? 왜 C가 스택에 많은 여분을 설치하려고합니까? 어셈블리의 50 바이트와 C의 8kb와 같은 이유는 무엇입니까?
아니요, 그는 그런 말하지 않았다. 그는 "2004 년에 유닉스에서 gcc -O2를 사용하여 테스트했고 두 버전 (iostreams 및 stdio)은 동일한 크기를 산출했습니다."* –
구체적으로 질문은 무엇입니까? 또한 Bjarne이이 사실에 대해 거짓말을했다는 주장은 다소 강하다고 생각합니다. 이전 시스템의 구형 컴파일러에서 바이너리가 동일한 크기를 가질 수도 있습니다 (최신 시스템이 아닐지라도 이것이 사실이 아닙니다). – templatetypedef
이제 심볼을 제거하십시오 ... –