Пропуск конструкторов копирования и перемещения
Недавно был опубликован пост про RVO/NRVO. Какой еще можно сделать вывод из этой статьи?
Конструкторы копирования/перемещения не всегда могут быть вызваны! И если вы туда засовываете, например, какие-то счетчики, которые должны влиять на внешний код, то будьте готовы, что они могут остаться нетронуты.
Вообще говоря, никогда не стоит определять никаких сайд эффектов в конструкторах / деструкторах / операторах, если вы на них рассчитываете. Иначе может случиться вот это.
Конечно же, такую оптимизацию можно отменить с помощью флага компиляции:
Тогда всё всегда будет вызываться, но при этом с потерей производительности. С другой стороны, это в принципе кажется странным — конструкторы не должны менять ничего снаружи себя. Соблюдайте это правило, и всё будет хорошо!
#cppcore #algorithm #hardcore
Недавно был опубликован пост про RVO/NRVO. Какой еще можно сделать вывод из этой статьи?
Конструкторы копирования/перемещения не всегда могут быть вызваны! И если вы туда засовываете, например, какие-то счетчики, которые должны влиять на внешний код, то будьте готовы, что они могут остаться нетронуты.
Вообще говоря, никогда не стоит определять никаких сайд эффектов в конструкторах / деструкторах / операторах, если вы на них рассчитываете. Иначе может случиться вот это.
Конечно же, такую оптимизацию можно отменить с помощью флага компиляции:
-fno-elide-constructors
Тогда всё всегда будет вызываться, но при этом с потерей производительности. С другой стороны, это в принципе кажется странным — конструкторы не должны менять ничего снаружи себя. Соблюдайте это правило, и всё будет хорошо!
#cppcore #algorithm #hardcore