Конструктор и деструктор по умолчанию когда-либо встроены? - PullRequest
8 голосов
/ 08 июня 2011

Мне любопытно, являются ли конструктор и деструктор по умолчанию, которые генерирует компилятор, встроенными или нет, потому что я могу оправдать это в любом случае. С одной стороны, вы хотите, чтобы конструктор / деструктор по умолчанию , а не был встроенным, чтобы позднее их добавление не нарушало ABI (поскольку объектные файлы, скомпилированные при наличии только значений по умолчанию, будут вставлять сгенерированные определения вместо этого. из того, что вы определяете). С другой стороны, для компилятора C ++ для компиляции кода C, который работает так же хорошо, как и при компиляции с помощью компилятора C, он не может добавлять вызовы конструктора / деструктора для каждой выделенной структуры, и в C ++ единственное функциональное различие между классами и структура должна быть защитой доступа по умолчанию. Может, линкер это как-то решает? Может быть, ответ зависит от компилятора?

Следствие этого вопроса: если у меня есть структура POD в C ++, могу ли я теоретически использовать некоторые компиляторы, определяя сам пустой пустой встроенный конструктор / деструкторы вместо значений по умолчанию?

Ответы [ 3 ]

17 голосов
/ 08 июня 2011

Стандарт C ++ гласит: 12.1 [class.ctor] / 5

Неявно объявленный конструктор по умолчанию является встроенным открытым членом своего класса

и в 12.4 [class.dtor] / 3

Неявно объявленный деструктор является встроенным открытым членом своего класса.

3 голосов
/ 08 июня 2011

если у меня есть структура POD в C ++, могу ли я теоретически использовать некоторые компиляторы, определяя сам пустой пустой встроенный конструктор / деструкторы вместо значений по умолчанию?

Теоретически, да! Любая функция (включая конструкторы и деструкторы) может быть объявлена ​​встроенной, и размещение тела функции в определении класса является одним из способов сделать это. Тем не менее, это зависит от компилятора, если он действительно встроен в функцию.

1 голос
/ 08 июня 2011

Это зависит от компилятора, но в целом: да, они должны.

По крайней мере, с помощью gcc вы получаете как встроенную, так и внешнюю функцию. Внешняя версия помечается как «ссылка один раз», поэтому независимо от того, сколько объектов генерирует конструктор по умолчанию, в связанном выводе может быть только одна версия. Если на самом деле никто не использует конструктор по умолчанию вне строки, он вообще не включается в связанный вывод, и у вас фактически есть чисто встроенная функция.

...