在他的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
我用\n
替换了std::endl
,它使二进制变小。我认为这种简单的内容会被内联,而我感到失望的是它不是。
另外哇,优化的组件有几百行汇编输出?我可以用5个汇编指令使用sys_write来编写hello world,那么所有额外的东西是什么?为什么C在堆栈上放置了一些额外的设置?我的意思是,为什么像50个字节的组件vs 8kb的C?
不,他没有这样说。他说*“在2004年,我在Unix上使用gcc -O2进行测试,并且两个版本(iostreams和stdio)产生相同的大小。”* – 2014-09-02 01:07:01
您的问题具体是什么?另外,我认为说Bjarne对此撒谎是有点强烈的。有可能在旧系统上使用较旧的编译器时,二进制文件具有相同的大小(即使在较新的系统中这种情况也是如此)。 – templatetypedef 2014-09-02 01:07:07
现在剥离符号... – 2014-09-02 01:09:31