В конструкторах C++ списки инициализации позволяют компилятору C++ создавать элементы-конструкторы на месте, в месте переменной-члена, вместо использования оператора присваивания, конструктора-копира или конструктора перемещения для инициализации переменной-члена. См. Section 10.6 of the C++ FAQ для более подробной информации.
В C нет таких автоматических операций, которые предоставляет компилятор C. Это означает, что программист напрямую контролирует всю инициализацию, и для устранения этих дополнительных операций не требуются специальные языковые функции.
Чтобы быть немного более ясно, что происходит, когда вы используете назначение для инициализации в C++ конструктор:
- Переменная член первый построен с конструктором по умолчанию
- временный объект построен
- Оператор присваивания или переноса присваивается для повторной инициализации переменной-члена с временным.
- Позвоните деструктору на временный.
Хотя некоторые компиляторы могут оптимизировать это в некоторых ситуациях, ваш пробег может отличаться, и ни один компилятор C++ не может оптимизировать эти шаги во всех ситуациях.Теперь рассмотрим, как программист будет точно дублировать эти шаги в C:
void my_struct_init(struct my_struct* sp)
{
member_init_default(&sp->the_member); /* default constructor for member */
struct member memb; /* temporary on stack */
member_init_other(&memb, ...params...); /* initialize memb */
member_assign(&sp->the_member,&memb); /* assign member */
member_finalize(&memb); /* finalize the temporary */
}
Немногие программисты C будут делать это (без уважительной причины). Вместо этого они будут автоматически закодировать оптимизацию:
member_init_other(&sp->the_member, ...params...);
Функция существует в C++, поскольку компилятор делает много автоматических вещей для программиста. Это часто делает жизнь проще программисту, но требует таких функций, как списки инициализации, чтобы помочь компилятору генерировать оптимальный код. Компиляторы C представляют собой гораздо более простую модель лежащей в основе машины, делают меньше вещей автоматически и, следовательно, требуют меньше функций (хотя и не обязательно меньше работы) для создания аналогичного оптимального кода.
Я сомневаюсь в том, что это функция исполнения. – Joe
Вы можете сделать данные статичными, если хотите избежать ненужной (повторной) инициализации. – teppic
@Joe - IIRC, заявка была сделана в «Основах C++» LiveLessons, но, возможно, это было неправильно, это было сделано в каком-то видеоуроке, который я смотрел. – dtech