在他的“使用C++编程、原则和实践”一书中,Bjarne在第314-316页中介绍了成员初始化程序列表的概念(§9.4.4)。他使用了以下示例:
// Simple Date (year, month, day)
class Date
{
public:
Date(int yy, int mm, int dd): y{yy}, m{mm}, d{dd}
{
//...
}
private:
int y, m, d;
};在第315页,他说:
我们本可以写到: 日期:日期( int yy,int mm,int dd) //构造函数{y= yy;m= mm;d= dd;} 但是,原则上,我们首先让缺省值初始化成员,然后将值分配给它们。
因此,我是否可以得出这样的结论:使用成员初始化程序列表可以稍微加快代码的速度?当然,在现代电脑上没有人会注意到。但是我计划在嵌入式开发中使用C++。
编辑:
我将进一步说明我的问题。我所说的“稍微快一点”实际上是指“所涉及的CPU周期更少”。
我也同意,这个例子的潜在效率提高将接近于零。但是对于大得多的类和结构,它可能会在微控制器上被注意到。
发布于 2017-10-08 13:46:28
在第二个示例中,您没有初始化,而是将变量赋值给已经初始化的变量。变量在进入构造函数之前被初始化(默认构造),因此实际上要设置它们两次。
int没有任何特定的默认初始化程序,所以您不会注意到,但是尝试使用不同的代码如图所示
#include <iostream>
using namespace std;
class Foo
{
int x;
public:
Foo() : x(0) { cout << "Foo()" << endl; }
Foo(int x) : x(x) { cout << "Foo(int)" << endl; }
Foo& operator=(const Foo& o) {
cout << "Foo::operator=(const Foo&)" << endl;
this->x = o.x; return *this;
}
};
class Bar
{
Foo foo;
public:
Bar(const Foo& foo) { this->foo = foo; }
Bar(bool, const Foo& foo) : foo(foo) { }
};
int main() {
cout << "Assigned in constructor" << endl;
Bar bar = Bar(Foo(5));
cout << "Assigned in initializer list" << endl;
Bar bar2 = Bar(false, Foo(5));
}这个指纹
Assigned in constructor
Foo(int)
Foo()
Foo::operator=(const Foo&)
Assigned in initializer list
Foo(int)所以你看它们绝对不是等价物。实际上,例如,您无法在构造函数中分配const字段。
发布于 2017-10-08 13:45:08
C++标准指定“默认初始化”如下:
dcl.init 要默认-初始化T类型的对象意味着: -如果T是(可能是cv-限定的)类类型(第9条),则调用T的默认构造函数(12.1) (如果T没有默认构造函数或过载解决方案(13.3)导致模糊,或导致初始化上下文中删除或无法访问的函数,则初始化不正确); -如果T是数组类型,则每个元素都是默认初始化的; -否则,不执行初始化。
你的班级成员是普通的,花园的,int的,他们不是类.它们不是数组。因此,默认初始化,在int的情况下,什么也不做.
在这两个示例中,我都希望大多数编译器生成相同的代码。不管怎么说都没什么区别。
https://stackoverflow.com/questions/46631675
复制相似问题