Рассмотрим эту программу:
#include <iostream>
struct A {
A() { std::cout << "A::A()\n"; }
A(int) { std::cout << "A::(int)\n"; }
void operator=(const A&) { std::cout << "A::operator=(const A&)\n"; }
};
struct C1 {
A a;
C1(int i) {
a = i;
}
};
struct C2 {
A a;
C2(int i) : a(i) {}
};
int main() {
std::cout << "How expesive is it to create a C1?\n";
{ C1 c1(7); }
std::cout << "How expensive is it to create a C2?\n";
{ C2 c2(7); }
}
В моей системе (Ubuntu 11.10, g++ 4.6.1) программа выдает такой вывод:
How expesive is it to create a C1?
A::A()
A::(int)
A::operator=(const A&)
How expensive is it to create a C2?
A::(int)
А теперь подумайте, почему он это делает. В первом случае C1::C1(int)
, a
должны быть сконструированы по умолчанию, прежде чем можно будет вызвать конструктор C1
. Затем он должен быть назначен через operator=
. В моем тривиальном примере нет доступного оператора присваивания int
, поэтому нам нужно построить A
из int. Таким образом, стоимость неиспользования инициализатора составляет: один конструктор по умолчанию, один конструктор int
и один оператор присваивания.
Во втором случае, C2::C2(int)
, вызывается только конструктор int
. Какой бы ни была стоимость конструктора по умолчанию A
, очевидно, что стоимость C2:C2(int)
не превышает стоимость C1::C1(int)
.
Или рассмотрите этот вариант. Предположим, что мы добавляем следующий элемент в
A
:
void operator=(int) { std::cout << "A::operator=(int)\n"; }
Тогда вывод будет выглядеть так:
How expesive is it to create a C1?
A::A()
A::operator=(int)
How expensive is it to create a C2?
A::(int)
Сейчас вообще нельзя сказать, какая форма эффективнее. В вашем конкретном классе стоимость конструктора по умолчанию плюс стоимость присваивания дороже, чем конструктор не по умолчанию? Если это так, то список инициализации более эффективен. В противном случае это не так.
Большинство классов, которые я когда-либо писал, были бы более эффективно инициализированы в списке инициализации. Но это эмпирическое правило, и оно не может быть верным для каждого возможного случая.
person
Robᵩ
schedule
05.12.2011