#cpp #оптимизация #cpp11 #gcc #компилятор
Речь пойдёт об инициализации объектов. Большинство делают это следующим образом: A a; или же A a(args); в случае передачи аргументов в конструктор. Но что будет в случае записи, подобной используемой в C#? А именно: A a = new A(); или же: var a = new A(); в случае C++ это выглядит как A a = A(); или же: auto a = A(); Но будет ли компилятор оптимизировать данную запись до обычного A a();, где, в отличии от моего предложенного варианта, нет оператора =?
Ответы
Ответ 1
Во-первых, во всех версиях спецификации С++ инициализация копированием при одинаковых типах левой и правой части сразу же рассматривается как прямая инициализация. То есть ваше A a = A(); сразу же означает именно A a(A()); // в условной записи, ведь на самом деле это объявление функции К "оптимизациям" это пока не имеет никакого отношения. Во-вторых, в С++11 будет ли этот вариант соптимизирован до A a(); // в условной записи, ведь на самом деле это объявление функции зависит от вашего компилятора. В любом случае, вы все равно обязаны предоставить доступный копирующий или перемещающий конструктор. В-третьих, начиная с С++17 этот вопрос уже не имеет отношения к оптимизациям. В С++17 запись A a = A(); сразу является просто альтернативной формой записи для A a(); // в условной записи, ведь на самом деле это объявление функцииОтвет 2
Насколько я понимаю и помню новый стандарт, это в обязательном порядке превратится в A a; потому как auto выведет тип как A, а объявление A a = A(); обязано быть соптимизировано просто в конструирование a без промежуточного копирования. "По-моему, так". (с) ПухОтвет 3
Во-первых, ни в одном из предложенных вариантов нет оператора =. Во-вторых, непонятно зачем так писать, ведь получается дублирование или излишества. Писать по аналогии с С# - явно не самая лучшая идея. Ну, а в-третьих, стоит использовать синтаксис list-initialization: A a{}; A a{args};
Комментариев нет:
Отправить комментарий