Код сборки, созданный для конструктора по умолчанию в C ++

StackOverflow https://stackoverflow.com/questions/5867110

  •  28-10-2019
  •  | 
  •  

Вопрос

Если я не определяю конструктор по умолчанию в классе в C ++ или в любых других конструкторах, я прочитал, что компилятор создает для вас конструктор по умолчанию. Но я создал тестовый класс, собрал его в код сборки и проверил, чтобы обнаружить, что ничего подобного не создано.
Может ли кто -нибудь уточнить, как создается код для конструктора по умолчанию, или он создан в первую очередь?

Это было полезно?

Решение

Создан конструктор по умолчанию Если вам это нужно, например:

class Foo {
  std::string s;
};

...
Foo f;

12.1:

Конструктор по умолчанию (12.1), копирование конструктора и оператора назначения копирования (12.8) и деструктора (12.4) являются специальными функциями члена. Реализация косвенно объявит эти функции участников для типа класса, когда программа явно не объявляет их, за исключением случаев, отмеченных в 12.1. Реализация косвенно определит их, если они используются, как указано в 12.1, 12.4 и 12.8.

Кроме того, если ваш класс не требует ничего, что можно сделать в конструкторе, компилятор может не генерировать код, хотя по стандарту должен существовать конструктор.

Другие советы

Вот что говорит стандарт C ++ 03:

§12.1/5:

Конструктор по умолчанию для класса X является конструктором класса X, который можно вызвать без аргумента. Если для класса X нет конструктора, разработанного пользователем, конструктор по умолчанию неявно объявляется. Неявно декоративный конструктор по умолчанию является встроенным публичным членом своего класса. Конструктор является тривиальным, если это неявно декоративный конструктор по умолчанию и если:

  • Его класс не имеет виртуальных функций (10.3) и нет виртуальных базовых классов (10.1), и
  • Все прямые базовые классы его класса имеют тривиальные конструкторы, и
  • Для всех нестатических членов данных своего класса, которые имеют тип класса (или их массив), каждый такой класс имеет тривиальный конструктор.

§12.1/6:

В противном случае конструктор нетривилен.

§12.1/7:

Неявно декоративный конструктор по умолчанию для класса неявно определяется, когда он используется для создания объекта своего типа класса (1.8). Неявно определенный конструктор по умолчанию выполняет набор инициализаций класса, который будет выполняться с помощью пользователя, написанного пользователем конструктором по умолчанию для этого класса с пустым списком меморизации (12.6.2) и пустым корпусом функции. Если этот написанный пользователем конструктор по умолчанию будет ищерт, программа плохо сформирована. Перед неявно декоративным конструктором по умолчанию для класса неявно определяется, все неявно декоративные конструкторы по умолчанию для его базовых классов и его нестатические элементы данных должны быть неявно определены. [Примечание: неявно декоративный конструктор по умолчанию имеет спецификацию исключения (15.4).


Смысл заключается в том, что для классов с неявно объявленным но неявно определено конструкторы по умолчанию или для классов с неявно определенными тривиальный Конструкторы по умолчанию, генерация кода не может потребоваться.

C ++! = Сборка.

Сборка является (одним из возможных) вывода для скомпилированной программы C ++, которая может включать или не включать определенные оптимизации, которые могли бы привести к вызову, возможно, пустому конструктору.

Другими словами, язык говорит, что есть конструктор по умолчанию, все в порядке, но он описывает только поведение, а не реализацию. Если реализация кажется, что она не должна генерировать код, она не должна.

Вы хотели спросить, действительно ли ваш компилятор выпускает код для конструктора по умолчанию?

Это зависит от оптимизации. Большинство современных компиляторов излучат последовательность кода конструктора по умолчанию при использовании с -O0, но оптимизируют ее, если она не используется, и вы используете -O2 или выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top