相关疑难解决方法(0)

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

我读这文章今天上午从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特定问题.

c++ performance constructor c++11

11
推荐指数
3
解决办法
358
查看次数

编译器生成的默认构造函数如何比只初始化成员什么都不做的自写结构更有效?

通过这个答案,我正在阅读核心准则

C.45:不要定义仅初始化数据成员的默认构造函数;改用类内成员初始化器

给出的理由是

原因

使用类内成员初始化器可使编译器为您生成函数。编译器生成的函数可以更有效。

请注意,这是专门针对默认构造函数的,该默认构造函数除了初始化成员外不执行任何操作,并且该准则建议不要编写这样的构造函数。

“坏”的例子是:

Example, bad

class X1 { // BAD: doesn't use member initializers
    string s;
    int i;
public:
    X1() :s{"default"}, i{1} { }
    // ...
};
Run Code Online (Sandbox Code Playgroud)

在该特定示例(或任何其他示例)中,编译器生成的构造函数比用户提供的构造函数更有效率吗?

我天真地希望初始化程序列表提供与类初始化程序相同的优化机会。

c++ initialization default-constructor cpp-core-guidelines

6
推荐指数
2
解决办法
96
查看次数