我对这个问题很好奇,但在互联网上找不到答案。
我们假设我们有简单的标题:
// SimpleHeader.h
class SimpleClass
{
int i;
}
众所周知,默认构造函数是为这个类自动生成的。
现在我还有两个文件:
// First.cpp
#include <SimpleHeader.h>
// ...
SimpleClass a;
// ...
和
//Second.cpp
#include <SimpleHeader.h>
// ...
SimpleClass b;
// ...
First.obj和Second.obj都包含类
的代码答案 0 :(得分:4)
从标准:如果你不编写任何构造函数,将为你提供一个默认构造函数,这个默认构造函数是内联定义的,等同于一个空的构造函数T::T() {}
。
我很确定[edit]你的内联构造函数根本不会产生任何机器代码。
答案 1 :(得分:3)
是的,可能是编译器必须在两个目标文件中生成代码,以防它们最终没有链接在一起。然后链接器使用一个定义规则来选择一个版本,并在将两个目标文件链接到一个可执行二进制文件时抛弃另一个版本。
答案 2 :(得分:3)
首先,它肯定取决于编译器和许多其他情况。
以下是3种常见情景。
生成默认构造函数并将其包含在每个First.obj和Second.obj对象文件中,但是当您将它们链接在一起以生成可执行文件时,只使用和包含其中一个。
构造函数在您创建对象的任何位置都是内联的(通常仅用于简单构造函数,编译器可以将内存清零的位置)
无需生成/调用默认构造函数。如果在文件范围内声明一个对象并且该对象只需要将其内存归零,则可能会发生这种情况 - 编译器可能只是将该对象放在一个在程序启动时初始化为零的特殊区域中 - 并且省略了默认的默认构造函数。
答案 3 :(得分:0)
默认构造函数不只是为对象分配空间。由于它不是动态变量,因此已经在加载器阶段分配了内存,不再需要代码。
如果您实现了复杂的构造函数并动态分配对象,会发生什么更有趣 在这种情况下,两个obj文件都将具有构造函数代码。
答案 4 :(得分:0)
都不是。在C和C ++中,你可以多次声明,说,这个函数有代码,但它在其他地方。您只能在该obj文件中定义一次,并在您定义它的位置定义代码生成的位置。因此,您有三个.cpp文件和一个标头,第一个定义类的文件,另外两个创建它的对象。其他两个文件的obj文件将不包含该类的任何代码,只有一些足以让链接器调用代码的信息是定义文件的obj。
如果在两个地方定义类,通过将方法定义隐式放在多个文件中包含的头中,链接器就不会介意,因为定义“相同”,它们恰好恰好出现在每个obj中,最终的应用程序将只包含生成的一个默认函数之一。
您始终可以根据需要创建任意数量的类,并且永远不会复制方法代码。它存在于一个位置,用于所有不同的文件,函数和on,以便使用和创建该类的对象。
一些默认构造函数可能很聪明并且需要一些代码,例如POD结构的一些可能完全优化而不需要任何代码。虽然制作更多实例并不复制任何函数,包括构造函数,但情况总是如此。