Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Оптимизирует ли компилятор GCC данную запись?

#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};

Комментариев нет:

Отправить комментарий