为什么隐式生成的构造函数(等)比用户定义的(普通的)更有效?

raf*_*fak 11 c++ performance constructor c++11

我读这文章今天上午从D.卡莱弗关于新的C++ 11功能"拖欠或删除功能",并且无法理解有关性能,即部分:

特殊成员函数的手动定义(即使它是微不足道的)通常比隐式定义的函数效率低.

通过谷歌搜索找到答案,我找到了同一作者的另一篇文章:

合成的构造函数和复制构造函数使实现能够创建比用户编写的代码更高效的代码,因为它可以应用其他方式并不总是可行的优化.

没有解释,但我不时阅读类似的说法.

但是如何写作:

class C { C() = default; };
Run Code Online (Sandbox Code Playgroud)

可以更有效率

class C { C(){} };
Run Code Online (Sandbox Code Playgroud)

?我虽然编译器足够聪明,可以检测到这种情况并对其进行优化.换句话说,编译器在看到=default而不是{}(void body function)时如何更容易优化?

编辑:编辑问题是为了添加"c ++ 11"标签,但这个问题仍然存在于c ++ 03上下文中:只是替换class C {C()=default;};class C {};,所以不是真正的c ++ 11特定问题.

Che*_*Alf 7

你问,怎么回事

class C { C() = default; };
Run Code Online (Sandbox Code Playgroud)

可以更有效率

class C { C(){} };
Run Code Online (Sandbox Code Playgroud)

好吧,两个构造函数都不做任何事情,所以谈论这个例子的效率是没有意义的.

但更一般地说,在例如复制构造函数中,可以想象一次复制一个POD项目将不会被简单的优化器识别为可优化的,而对于自动生成,它可能只是做一个memcpy.谁知道.这是一个实施质量问题,我也很容易想象相反的问题.

所以,衡量,如果重要的话.

干杯&hth.,


Ben*_*igt 6

谈论“特殊成员函数的手动定义(即使它是微不足道的)”毫无意义,因为用户提供的特殊成员函数根据定义是非微不足道的。当使用类型特征以及 POD 特性时,这种非平凡性就会发挥作用,许多优化只能使用平凡或 POD 类型。

对同一引言的更好重述是:

默认的特殊成员函数使能够检测到可以完全省略对这些函数的调用。

来自第 12.1 节 [class.ctor]

默认构造函数是微不足道的,如果它既不是用户提供的,也不能删除,如果:

  • 它的类没有虚函数(10.3)和虚基类(10.1),并且
  • 其类的任何非静态数据成员都没有大括号或相等的初始化程序,并且
  • 它的类的所有直接基类都有简单的默认构造函数,并且
  • 对于所有属于类类型(或其数组)的类的非静态数据成员,每个这样的类都有一个简单的默认构造函数。

否则,默认构造函数 是非平凡的

从第 12.8 节[class.copy]

类 X 的复制/移动构造函数是 微不足道的,如果它既不是用户提供的也不是删除的,并且如果

  • X 类没有虚函数 (10.3) 和虚基类 (10.1),并且
  • 选择复制/移动每个直接基类子对象的构造函数是微不足道的,并且
  • 对于 X 的每个类类型(或其数组)的非静态数据成员,选择复制/移动该成员的构造函数是微不足道的;

否则复制/移动构造函数是非平凡的

从第 9 节,[class]

一个普通的可复制类是这样一个类:

  • 没有非平凡的复制构造函数(12.8),
  • 没有非平凡的移动构造函数(12.8),
  • 没有非平凡的复制赋值运算符 (13.5.3, 12.8),
  • 没有重要的移动赋值运算符 (13.5.3, 12.8),和
  • 有一个简单的析构函数 (12.4)。

琐碎类是具有一个平凡缺省构造(12.1),并且是能够复制平凡的一类。[注意:特别是,一个平凡的可复制或平凡的类没有虚函数或虚基类。— 尾注 ]


Sim*_*one 0

说实话,我也看不出来。

除其他事项外,我可以明白为什么应该使用

class C { C() = default; };
Run Code Online (Sandbox Code Playgroud)

在我看来这和

class C { };
Run Code Online (Sandbox Code Playgroud)

或者,如果提供了其他构造函数,如下所示:

class C { 
    C() {}
    // other constructors.
};
Run Code Online (Sandbox Code Playgroud)

我看不到作者在这里写的真正问题。