C ++对象文件的大小取决于什么?

时间:2011-09-06 11:56:34

标签: c++ compiler-construction object-files

每当我们编译c ++文件时,都会生成一个obj文件。我想知道obj文件的大小取决于哪些因素?

只是为了让我的问题更清楚, 例如,c ++文件包含一个类声明,该类有一个整数变量作为数据成员,并且还有一些成员函数。如果我编译这个文件,那么一些obj文件将创建一些X大小。现在假设我添加了更多的数据成员和成员函数,那么obj文件的大小会改变吗?

3 个答案:

答案 0 :(得分:10)

这取决于一百万个不同因素,完全取决于平台,编译器和设置。

目标文件必须包含具有外部链接的函数的函数体的所有程序集,以及具有外部链接的所有全局变量。任何具有内部链接的内容可能会或可能不会保证目标文件中的单独条目,因为这些条目可能已被优化并直接集成到其调用站点中。这在很大程度上取决于优化设置。

GCC还有一个“链接时优化”选项,它实质上将整个源代码的副本添加到目标文件中,并大大增加其大小。

调试符号还会添加大量额外数据。

对于特定于C ++的问题:类定义本身在程序集中不可见。非内联成员函数只是需要编译的更多函数,而数据成员只是与原始数据成员相同 - 如果您声明该类型的实例,它们将在调用堆栈上,但它们不直接影响汇编代码......除非你用常量初始化东西;当然,常量会进入代码。

答案 1 :(得分:3)

在编译源代码之后但在链接之前,目标文件包含(以及其他)机器代码。因此,目标文件的大小基本上取决于代码的复杂程度。

大多数编译器都允许您在编译期间添加调试符号以使调试更容易,但会增加目标文件的大小。您可以使用-g选项添加调试符号,并使用GCC中的-s选项将其删除。 Visual Studio有类似的东西。

答案 2 :(得分:2)

它依赖于编译器,但是。

目标文件将包含可执行代码,链接存根和元数据。元数据可以是任何编译器相关的东西,所以它是不可能的 - 根据编译器的想法,任何事情都可能发生。为具有外部链接的所有实体创建链接存根,并为所有对其他目标文件中的实体的传出引用创建链接存根 - 这不会直接受到在同一对象文件中将类添加到类中的影响。

现在来编码。当你添加一个成员变量时,它必须被构造和销毁 - 这将需要一个构造函数和一个析构函数,这两者都可能是微不足道的。如果它们不是微不足道的话,这将导致代码大小略有增长,因为现在必须做一些额外的事情来处理那些成员变量并且需要额外的代码。