为什么 C/C++ "Hello World" 以千字节为单位?
Why is a C/C++ "Hello World" in the kilobytes?
可能的重复项:
为什么编译的 Java 类文件比 C 编译的文件小?
只是出于好奇,我刚刚用C,C++和Java编译了"Hello Worlds"。
Java 类文件非常精简,只有 423B,我理解,因为运行时不包含在二进制文件中。
然而,C和C++是8.5K和9.2K。
为什么它们这么大?我一直假设 stdio 或 iostream 是动态链接的,并且不会增加可执行文件的大小。
那么千字节从何而来呢?通过查看十六进制转储,我看到有很多填充,我想是出于性能原因。为什么二进制格式会这样组织?
PMG的链接非常有帮助!
关于填充,我发现程序的段与虚拟内存页面边界(4096 字节)的对齐导致它至少为 8192 字节。
关于 mach-o 二进制格式(适用于 OS X 和 iOS)
为了获得最佳性能,段应在虚拟内存页面边界上对齐 - PowerPC 和 x86 处理器为 4096 字节。要计算段的大小,请将每个段的大小相加,然后将总和四舍五入到下一个虚拟内存页边界(4096 字节或 4 KB)。使用此算法,段的最小大小为 4 KB,此后以 4 KB 为增量
。
引用 http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html
下次问之前我会做研究;)
这是一个你正在测量的问题。 如果是原始可执行文件大小,则除了用于main()
的代码之外,它还包含很多内容。
由于我们在这里使用共享动态库,因此大量的大小将由内务管理数据(如符号表、全局偏移表和要链接的共享库的描述)来解释 - 共享库本身的代码不在二进制文件中。
iostream库是一个相当大的库,并且也有静态初始化器,例如初始化cout
,cerr
和cin
对象。 这是对象文件必须包含的另一件事。
实际上,当应用程序运行时,大多数额外大小不是内存驻留的。
C&C++是一个完整的独立程序。 Java只是核心代码,需要另一个程序来运行它。
一个较小的hello世界是使用bash脚本(也需要另一个程序才能运行)
echo Hello World
总共 17 个字节,带有一个新行。
因为包含了stdlib。 尝试使用 -nostdlib
一个因素是
#include <iostream>
这会导致许多标准库与您的程序链接。但是,无需担心。这只是一个初始开销,它不会随着程序的复杂性或代码长度的增加而增加。无论如何,请使用尝试使用 UPX。
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 获取嵌套 stl 容器的大小(以字节为单位)
- 常量"C"占用的空间(以字节为单位)
- C++ 中 STL 中迭代器的大小(以字节为单位)是多少
- 有人知道可以使用 c++ 以字节为单位编码 asm 字符串的任何东西吗?
- 如何以字节为单位计算mpz_class的长度?
- 获取C++模板参数包的总大小(以字节为单位)
- C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
- visual 在指向缓冲区(字符串 " ")的空指针上使用 sizeof() C++ 以获得以字节为单位的大小?
- 如何获得以字节为单位的UTF-16LE字符串的大小
- 为什么 C/C++ "Hello World" 以千字节为单位?
- C++字符串长度(以字节为单位)
- 解码像 FAST 这样的数据协议的快速方法是什么,其中数据以字节为单位编码,并将位作为存在标志
- 解压缩加密文件(以字节为单位)
- 在 boost::multi_array 中以字节为单位表示步幅
- 省略号函数参数的大小(以字节为单位)
- C++获取EOL的大小(以字节为单位)
- 在openMPI中向进程发送数据(以字节为单位)的最佳方式
- 获取矢量的大小(以字节为单位)
- 如何将数组限制在特定的大小(以千字节为单位)