Подтвердить что ты не робот

Почему конструктор по умолчанию и деструктор класса inline?

Я прочитал из несколько источники, которые:

Если для типа класса (struct, class или union) не предусмотрены объявленные пользователем конструкторы любого типа, компилятор будет всегда объявлять конструктор по умолчанию как открытый открытый член своего класса.

Почему было принято это решение (явно объявить ctors/dtors как встроенный)? Составители бесплатны для inline/non-inline? Тем более, что inlining ctors может иметь огромный штраф за клиентов класса (Эффективный С++, Item # 30)?

4b9b3361

Ответ 1

inline имеет два значения в стандарте С++.

Первое, о чем вы думаете, когда слышите inline; взяв код в функции и введя его в место, где он вызывается.

Стандарт С++ рекомендует реализации для этого, когда они видят метод или функцию inline, но не требуют этого. Поскольку такое действие имеет нулевые наблюдаемые изменения поведения в абстрактной машине, которые описывает стандарт С++, я считаю это ненормативным советом.

Вторая связана с привязкой. Функция inline (или в С++ 17 переменная) может существовать в нескольких единицах перевода. Обычно это вызывает ошибку во время соединения; но когда переменная или функция inline, вместо этого все, кроме одного из экземпляров переменной или функции, молча отбрасываются. Если они отличаются каким-либо важным способом, это делает вашу программу плохо сформированной, не требуя диагностики.

Это второй смысл, почему неявные ctors и dtors неявно встроены; это означает, что ни одна единица перевода не должна выбираться для того, чтобы "жить". Вместо этого они генерируются везде, где они необходимы. Они могут быть преимущественно привязаны к вызывающему коду, но самое главное, если какие-либо рудиментарные копии его все еще существуют (потому что это не было написано, скажем), во время ссылки ошибка не возникает, и вместо этого все, кроме одного, отбрасываются.

См. inline в стандарте С++. Формулировка в стандарте немного сложнее понять, другая и более точная, чем я использовал выше.

Ответ 2

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

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