当前位置: 首页 > 面试题库 >

为什么C / C ++的“ Hello World”以千字节为单位?

易骁
2023-03-14
问题内容

出于好奇,我只是用C,C ++和Java编写了“ Hello Worlds”。

我理解Java类文件只有423B,因为运行时未包含在二进制文件中。

C和C ++分别是8.5K和9.2K。

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

那么,所有千字节来自何处?通过查看hexdump,我发现有很多填充,我想是出于性能原因。为什么确切地这样组织二进制格式?

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库是一个相当大的,也有静态initialisers
-例如初始化coutcerr以及cin对象。这是目标文件必须包含的另一件事。

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



 类似资料:
  • 问题内容: 方案:各种文件的大小以字节为单位存储在数据库中。将大小信息格式化为千字节,兆字节和千兆字节的最佳方法是什么?例如,我有一个MP3,Ubuntu显示为“ 5.2 MB(5445632字节)”。如何在网页上将其显示为“ 5.2 MB”,并且文件大小小于1 MB的文件显示为KB,文件大小大于1 GB的文件显示为GB? 问题答案: (取自php.net,那里还有许多其他示例,但我最喜欢这个示例

  • 协议缓冲区说它可以包含任何任意的字节序列。但是如果我的数据包含“\0”,协议缓冲区如何从字符串变量对我的整个数据进行编码。

  • 当我要遍历a-z时,我可以使用: 但是里面的原理是什么?为什么我们可以计算char而不需要转移到int来计算?

  • 需要明确的是:我确实知道和是在C库中实现的,它通常从操作系统分配大量内存,并进行自己的管理,以将较小的内存分配给应用程序并跟踪分配的字节数。这个问题不是自由如何知道释放多少。 相反,我想知道为什么免费首先是这样做的。作为一种低级语言,我认为要求C程序员不仅要跟踪分配了什么内存,还要跟踪分配了多少内存是完全合理的(事实上,我通常发现我最终还是要跟踪malloced的字节数)。我还发现,明确给出释放的

  • 问题内容: 我们想在JVM上运行C#代码 我公司的C#代码库很大。这段代码的一半以上是我们用于创建,读取,修改,计算和编写Excel工作簿的核心引擎。我们经常收到来自客户和潜在客户的问题,询问我们是否要构建引擎的Java版本- 他们中的许多人对UI完全不感兴趣。我们甚至有一些客户不愿意从其Java应用程序中使用.NET库。 因此,我们希望构建Java版的核心引擎,理想情况下无需维护单独的Java源

  • 问题内容: Ada,Pascal和许多其他语言都支持范围,这是对整数进行子类型的一种方式。范围是一个有符号整数值,范围从一个值(第一个)到另一个值(最后一个)。实现一个在OOP中执行相同操作的类很容易,但是我认为本机支持该功能可以使编译器进行其他静态检查。 我知道无法静态地验证范围内定义的变量不会“溢出”运行时(即由于输入错误),但是我认为可以做些什么。我考虑了按合同设计方法(Eiffel)和Sp