Bjarne Stroustrup 在他的常见问题解答中表示,当使用 gcc -O2 编译时,使用 C 和 C++ 的 hello world 的文件大小是相同的。
参考:http://www.stroustrup.com/bs_faq.html#Hello-world 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;
}
我这里编译了一下,大小不一样:
r00t@wutdo:~/hello$ ls
hello.c hello.cpp
r00t@wutdo:~/hello$ gcc -O2 hello.c -o c.out
r00t@wutdo:~/hello$ g++ -O2 hello.cpp -o cpp.out
r00t@wutdo:~/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
r00t@wutdo:~/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
with \n
它使二进制文件变得更小。我认为这么简单的东西会被内联,但我很失望它不是。
另外哇,优化后的程序集有数百行程序集输出?我可以使用 sys_write 用大约 5 条汇编指令编写 hello world,所有额外的东西是怎么回事?为什么C要在堆栈上放置一些额外的东西来设置?我的意思是,就像 50 字节的汇编 vs 8kb 的 C,为什么?
您看到的信息很容易被误解。 8559 和 8938 字节的文件大小基本上没有意义,因为它们主要是带有符号名称和其他杂项信息的标头,至少用于最小的调试目的。这somewhat有意义的数字是size(1)
您稍后添加的输出:
r00t@wutdo:~/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
您可以使用以下方法获得更详细的细分:-A
选项size
,但简而言之,这里的差异相当微不足道。
更有趣的是,Bjarne Stroustrup 从未提及他是在谈论静态链接还是动态链接。在您的情况下,两个程序都是动态链接的,因此大小差异与 stdio 或 iostream 的实际大小成本无关;您只是测量调用代码的成本,或者(更有可能的是,基于其他注释/答案)C++ 异常处理支持的基本开销。现在,有一个普遍的说法,即静态链接的基于 C++ iostream 的 hello world 甚至可以比printf
基于的,因为编译器可以准确地看到哪些重载版本operator<<
使用并优化不需要的代码(例如昂贵的浮点打印),而printf
格式字符串的使用使得这在常见情况下变得困难并且一般来说是不可能的。然而,我从未见过一个 C++ 实现,其中静态链接的基于 iostream 的 hello 程序可以接近与一个小程序一样小,甚至更小。printf
基于 C 的一个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)