是为C+中的默认构造函数创建的汇编代码+; 如果我没有在C++中的类中定义默认构造函数,或者其他任何构造函数,我已经读到编译器为你创建了一个默认构造函数。但我创建了一个测试类,将其编译成汇编代码,并进行检查,发现没有创建任何类似的类。 是否有人可以澄清默认构造函数的代码是如何创建的,或者是否首先创建的?

是为C+中的默认构造函数创建的汇编代码+; 如果我没有在C++中的类中定义默认构造函数,或者其他任何构造函数,我已经读到编译器为你创建了一个默认构造函数。但我创建了一个测试类,将其编译成汇编代码,并进行检查,发现没有创建任何类似的类。 是否有人可以澄清默认构造函数的代码是如何创建的,或者是否首先创建的?,c++,default-constructor,C++,Default Constructor,如果您需要,默认构造函数将创建,例如: 12.1: 默认构造函数(12.1),复制 构造函数和副本赋值 操作员(12.8)和析构函数(12.4) 是特殊的成员功能。这个 实现将隐式声明 这些成员函数用于类 当程序不运行时键入 明确声明它们,除非 如12.1所述。实施将 如果是,则隐式定义它们 按照12.1、12.4和 12.8 此外,如果类不需要在构造函数中执行任何操作,编译器可能会选择不生成代码,即使按照标准,构造函数应该存在。C++!=大会 汇编是一个编译的C++程序的输出(一个可能的),它

如果您需要,默认构造函数将创建,例如:

12.1:

默认构造函数(12.1),复制 构造函数和副本赋值 操作员(12.8)和析构函数(12.4) 是特殊的成员功能。这个 实现将隐式声明 这些成员函数用于类 当程序不运行时键入 明确声明它们,除非 如12.1所述。实施将 如果是,则隐式定义它们 按照12.1、12.4和 12.8

此外,如果类不需要在构造函数中执行任何操作,编译器可能会选择不生成代码,即使按照标准,构造函数应该存在。

C++!=大会

汇编是一个编译的C++程序的输出(一个可能的),它可能包含或可能不包含某些优化,这些优化可以省去调用一个可能的空构造函数。


换句话说,该语言说有一个默认构造函数,但它只描述行为,而不是实现。如果一个实现感觉不需要生成代码,它就不必生成代码。

C++03标准是这样说的:

§12.1/5:

类X的默认构造函数是类X的构造函数,无需参数即可调用。如果类X没有用户声明的构造函数,则隐式声明默认构造函数。隐式声明的默认构造函数是其类的内联公共成员。如果构造函数是隐式声明的默认构造函数,并且:

  • 它的类没有虚拟函数(10.3)和虚拟基类(10.1),并且
  • 它的类的所有直接基类都有平凡的构造函数,并且
  • 对于其类中属于类类型(或其数组)的所有非静态数据成员,每个此类类都有一个普通构造函数
§12.1/6:

否则,构造函数是非常重要的

§12.1/7:

隐式声明的类的默认构造函数在用于创建其类类型(1.8)的对象时被隐式定义。隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户编写的默认构造函数为具有空mem初始值设定项列表(12.6.2)和空函数体的类执行。如果用户编写的默认构造函数格式不正确,则程序格式不正确。在隐式定义类的隐式声明默认构造函数之前,应隐式定义其基类及其非静态数据成员的所有隐式声明默认构造函数。[注:隐式声明的默认构造函数有一个异常规范(15.4)。]



这意味着,对于具有隐式声明但未隐式定义的默认构造函数的类,或者对于具有隐式定义的普通默认构造函数的类,可能不需要生成代码。

是否询问编译器是否实际为默认构造函数发出代码


这取决于优化。大多数现代编译器在与-O0一起使用时会发出默认的构造函数代码序列,但如果未使用,并且您使用-O2或更高版本,则会对其进行优化。

我怀疑编译器是否决定生成任何代码取决于您的类的外观。如果您有需要调用的类成员和构造函数,那么编译器就有理由生成代码。如果您的类成员仅为基本类型(例如int),则默认构造函数无需执行任何操作,因此编译器无需编写任何代码……或者只需内联构造函数也不是很简单。默认构造函数始终是创建的。然而,它是内联的,如果它很简单,就不会为它生成任何机器代码。(除了添加一个具有非平凡构造函数的类之外,您还可以简单地添加一个虚拟函数使其非平凡。)@James Kanze:它总是被声明的。仅当您使用它构造对象时,才会定义它。是。我对“创造”这个词的选择有点模糊,因为有两个“创造”:一个是宣言的创造,一个是定义的创造。第一种情况总是发生,第二种情况仅在需要时发生。
class Foo {
  std::string s;
};

...
Foo f;