Java 为什么是C/C++&引用;“你好,世界”;以千字节为单位?

Java 为什么是C/C++&引用;“你好,世界”;以千字节为单位?,java,c++,c,executable,Java,C++,C,Executable,可能重复: 正是出于好奇,我才在C、C++和java中编译了“Hello World”。 Java类文件非常精简,只有423B,我理解这是因为二进制文件中没有包含运行时 p和C++的是85K和92K,但是 为什么它们比较大? 我一直认为stdio或iostream是动态链接的,不会增加可执行文件的大小 那么所有的千字节是从哪里来的呢? 通过查看hextump,我发现有很多填充,我猜是出于性能原因。为什么二进制格式是这样组织的 pmg的链接非常有用 关于填充,我发现是程序的段与虚拟内存页边界

可能重复:

正是出于好奇,我才在C、C++和java中编译了“Hello World”。 Java类文件非常精简,只有423B,我理解这是因为二进制文件中没有包含运行时

<> p和C++的是85K和92K,但是

为什么它们比较大? 我一直认为stdio或iostream是动态链接的,不会增加可执行文件的大小

那么所有的千字节是从哪里来的呢? 通过查看hextump,我发现有很多填充,我猜是出于性能原因。为什么二进制格式是这样组织的


pmg的链接非常有用

关于填充,我发现是程序的段与虚拟内存页边界(4096字节)对齐导致它至少为8192字节

关于mach-o二进制格式(适用于OS X和iOS)

为了获得最佳性能,段应在虚拟内存页边界上对齐—对于PowerPC和x86处理器,为4096字节。要计算段的大小,请将每个段的大小相加,然后将总和四舍五入到下一个虚拟内存页边界(4096字节或4KB)。使用此算法,段的最小大小为4KB,然后按4KB的增量调整大小

引用


我会在下次询问之前做调查;)

因为stdlib包括在内。尝试使用-nostlib

一个因素是

#include <iostream>
#包括

这导致许多标准库与您的程序链接。不过,没必要担心。这只是一个初始开销,不会随着程序的复杂性或代码的长度而增加。无论如何,使用试用版。

< P> C++是一个完整的独立程序。Java只是核心代码,需要另一个程序来运行它

一个较小的hello世界是使用bash脚本(也需要另一个程序来运行)


总共17个字节,加上一个新行。

这是一个你在测量什么的问题。如果是原始可执行文件的大小,那么除了
main()
的代码之外,它还包含很多内容

当我们在这里使用共享动态库时,很大一部分大小将由内部管理数据(如符号表、全局偏移量表和要链接的共享库的描述)来解释-共享库本身的代码不是二进制代码

iostream库是一个相当大的库,并且还具有静态初始化器-例如初始化
cout
cerr
、和
cin
对象。这是对象文件必须包含的另一个内容


实际上,当应用程序运行时,大多数额外的大小不是内存驻留。

您可能想阅读。@pmg-谢谢您的链接。这是一个令人惊叹的作品,写得非常好。这让我想起了demoscene,一个64 kB的程序可以打开一个带有按钮和复选框的窗口进行设置,然后播放一个惊人的3d视频,完整的声音,超过5分钟长,即使在一个视频帧中,即使是一个图像文件也可以有超过64 kb的压缩。是和不是C和C++包含可执行代码,但是它仍然依赖于大量的管道:OS必须解析ELF文件,而单独的库(STDLIB)仍然必须存在于系统上。但是您是对的,它不依赖于单独的解释器/编译器将文件转换为可执行代码。如果没有C标准库,hello world程序将不会链接,或者需要对原始系统调用执行一些IO。结果将是一个非常小的二进制文件!
echo Hello World