Определенные пользователем конструкторы по умолчанию менее эффективны?

Несколько дней назад во время чтения Стандартные новости C ++ Я прочитал пост о По умолчанию функции в C ++ 11, в этой статье упоминается, что определяемый пользователем конструктор менее эффективен, чем конструктор, сгенерированный компилятором:

Определенный пользователем конструктор по умолчанию менее эффективен, чем неявно определенный компилятором конструктор по умолчанию.

Продолжая чтение, есть пример, где определяемый пользователем конструктор помечается как заданный по умолчанию, а затем говорит:

явно заданный по умолчанию конструктор более эффективен, чем конструктор по умолчанию, запрограммированный вручную.

Я не понимаю этих утверждений, поэтому мне было интересно:

  • Почему конструктор по умолчанию для пользователя (или специальная функция-член) будет менее эффективным, чем неявно определенный компилятором?
  • Как повысить эффективность за счет явного сброса по умолчанию конструктора (или специальной функции-члена)?
  • Каким руководствам я должен следовать, чтобы выбрать конструктор по умолчанию (или специальную функцию-член) и как эффективность влияет на это решение?

7

Решение

Я думаю, что лучше сказать, что пользовательский конструктор по умолчанию МОЖЕТ быть менее эффективным, чем сгенерированный компилятор.

Например, когда он генерирует конструктор по умолчанию внутри, компилятор может делать предположения и оптимизации, которые он не может сделать для определяемого пользователем consttructor (на ум приходят побочные эффекты).

Также имейте в виду, что определяемый пользователем конструктор по умолчанию может выполнять совершенно иную работу, чем конструирование по умолчанию всех его членов, что делает его менее эффективным (но также и более правильным). Однако это не относится к указанной вами ссылке.

3

Другие решения

И мы все знаем, что если это написано в интернете, значит, это правильно … Подожди, а?

В статье, где я нашел первое утверждение менее эффективным, автор говорит правду. Хотя вы, кажется, неверно истолковали это — в примере это относится к ручной обработке ctor, использующей присваивание. Без веских причин и идущих против двух десятилетий руководящих принципов.

Следующий экземпляр, тот же случай. (В качестве практического замечания я добавлю, что для любого компилятора, утверждающего, что он имеет оптимизацию, я ожидаю, что такой же вывод в сборе даже для этой формы …)

Я не вижу причин, почему правильный рукописный ctor будет отличаться от дефолтного в любом случае, включая эффективность. OTOH, если они идентичны, почему на земле это написать? Я очень рад, что компилятор делает это для меня. И, наконец, я даже могу контролировать это в некоторых отношениях, которые раньше не мог. Могли бы использовать больше таких функций. 😉

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector