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

On what does the size of an C++ object file depend?

本文关键字:取决于 什么 对象 文件 c++      更新时间:2023-10-16

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

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

这取决于无数不同的因素,完全取决于平台、编译器和设置。

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

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

调试符号也增加了很多额外的数据。

对于您的c++特定问题:类定义本身在程序集中并不真正可见。非内联成员函数只是需要编译的更多函数,而数据成员只是被视为基本数据成员——如果声明该类型的实例,它们将位于调用堆栈上,但它们不会直接影响汇编代码……除非你用常量初始化;当然,代码中也有常量

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

大多数编译器为您提供了在编译期间添加调试符号的选项,以使调试更容易,但会增加目标文件的大小。您可以在GCC中使用-g选项添加调试符号,并使用-s选项删除它们。Visual Studio也有类似的功能。

它严重依赖于编译器,但是。

目标文件将包含可执行代码、链接存根和元数据。元数据可以是任何依赖于编译器的东西,所以这是不可能的——任何事情都可能发生在它身上,这取决于编译器的想法。链接存根是为所有具有外部链接的实体以及对其他对象文件中实体的所有传出引用创建的——在同一个对象文件中向类中添加成员不会直接影响。

现在开始编码。当您添加成员变量时,必须构造和销毁它——这将需要构造函数和析构函数,两者可能是微不足道的,也可能不是。如果它们不是微不足道的,这将导致代码大小的轻微增长,因为现在必须做一些额外的事情来处理这些成员变量,这需要额外的代码。