为什么为"Hello World"程序生成的代码对C++比为 C 生成的代码大 10 倍?

Why is the code generated for "Hello World" program 10 times larger for C++ than for C?

本文关键字:代码 Hello World 程序生成 C++ 为什么 比为      更新时间:2023-10-16

这是我最近在Bjarne Stroustrup博士的网站上读到的常见问题解答。我还用C和C++测试了一个简单的"Hello World"程序,令人惊讶的是,C++"Hello World"程序可执行文件的大小为1357 KB(1.32 MB),而C中可执行文件只有122 KB。为什么C"Hello World"程序和C++"Hello世界"程序在大小上有如此巨大的差异?

http://stroustrup.com/bs_faq.html#Hello-世界

我使用的是Orwell Dev-C++编译器。我使用了选项"剥离可执行文件"&重新编译。完成此操作后,大小在C中减少到12KB,在C++中减少到536KB。

以下是使用gcc编译的c和c++hello-world程序的二进制文件大小的比较:http://coliru.stacked-crooked.com/a/46126d97d45fba1a

该平台上的c和c++之间的大小差异是240字节,无论是剥离的还是非剥离的可执行文件,这在我看来都是微不足道的。

正如Stroustrup在您链接的页面上所写:

这都是一个实现者如何组织标准库的问题(例如静态链接与动态链接、默认的区域设置支持与通过和选项启用的区域设置支撑等)。如果一个版本比另一个版本大得多,请向更大版本的实现者报告问题。

Stroustrup没有指定多少应该被视为"重要",但如果你的编译器为一个相同的helloworld程序生成了10倍大的二进制文件,那么错误报告可能是合适的。

这取决于您的编译器以及您使用的环境。如果你静态链接,那么你将在你的可执行文件中包括标准库,而通常这是动态的,因为标准库在不同的平台上可能会有所不同(尽管我想你无论如何都会单独编译)。此外,正如您在这里看到的,它确实会使可执行文件的文件大小膨胀。

尝试动态链接到标准库,您可能需要将库二进制文件复制到与可执行文件相同的目录中。在此之后,文件大小可能会非常相似。