2013-04-19 2 views
1

У меня есть класс, который я должен создать множество раз. Это что-то вроде этого:Инициализация членов базового класса в списке инициализаторов производного класса

class A 
{ 
    public: 

    A() : a1(0.0f), a2(-1) {} 

    float a1; 
    int a2; 
}; 

class B : public A 
{ 
    B(); 
    float b; 
}; 

Я имею в виду 2 пути реализации CTOR из B:

B(): A(), b(0.0f) {} // Using the base class ctor. 

B(): b(0.0f) { a1 = 0.0f; a2 = -1; } // Not using the base class ctor. Ugly but maybe faster? 

Какой из них быстрее?

Мои типы членов являются базовыми (int, float, double ...) как в базовом, так и в унаследованном классе.

Компилятор: Intel и LLVM.

+0

Вы пытались самим измерить время? – piokuc

+0

@ user2280716 Согласен. Как сказал Дональд Кнут: «Преждевременная оптимизация - это корень всего зла». – michaelb958

+0

Даже если игнорировать все соображения преждевременной оптимизации, обе версии приведут к тому же самому коду. Второй может быть даже медленнее (если игнорировать все усилия по оптимизации компилятора), потому что конструктор по умолчанию 'A' всегда будет вызываться, если вы не вызываете один из его конструкторов самостоятельно. Так что просто упущение это не помешает ему быть вызванным. И в конце концов я не думаю, что вторая даже скомпилируется, так как вы не должны инициализировать членов базового класса. –

ответ

2

Первый способ - ваш единственный вариант. Ваш второй «вариант» не будет работать, потому что a1 и a2 объявлены в базовом классе и, следовательно, не могут быть инициализированы в списке инициализаторов B.

Полагает, что они принадлежат к A, поэтому их инициализации несет ответственность A и будут сделаны в конструкторе A, который находится перед любой другой инициализацией происходит в B. Независимо от того, что вы делаете, всегда будет конструктор A, называемый первым шагом построения объекта B. Даже если вы каким-то образом избегаете этого и инициализируете участников напрямую с B, нет реальной причины ожидать реального улучшения производительности.

0

Вы не можете инициализировать элементы базового класса в списке инициализации производного класса. Второй не будет компилироваться.

Вы должны выбрать, какой из конструкторов A будет называться; если вы не укажете ни одного, то по умолчанию A() будет вызываться автоматически. Невозможно вызвать конструктор базового класса.

Смежные вопросы

 Смежные вопросы