Почему встроенные конструкторы и деструкторы не очень хорошая идея в C ++? - PullRequest
16 голосов
/ 21 августа 2011

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

Ответы [ 5 ]

35 голосов
/ 21 августа 2011

Компилятор свободен для встроенного кода, который вы не объявили встроенным, и не может встроить код, который вы объявили встроенным.Я видел, как компиляторы делают обе эти вещи.Из-за этого ключевое слово inline не означает, что думает большинство людей.Это означает, что нужно разрешить исключение из одного правила определения, чтобы вы могли помещать функции и т. Д. В заголовочный файл и не получать ошибок компоновщика.

Так что совет дрянь, пусть компилятор решит, что лучшевстроенный, а что нет.Поместите его в нужное место, чтобы избежать ошибок компоновщика, вот и все.

4 голосов
/ 21 августа 2011

Помимо причины, которую @oli упоминает в своем ответе:

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

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

4 голосов
/ 21 августа 2011

Нет абсолютно никакой причины избегать встроенных конструкторов и деструкторов.Книга не права, как не правильно.

3 голосов
/ 21 августа 2011

Я не знаю о конструкторах, но деструкторы очень часто virtual. В большинстве случаев компилятору не имеет смысла встраивать виртуальные функции, потому что до времени выполнения не будет известно, какое переопределение будет вызвано.

0 голосов
/ 12 февраля 2015

Я почти уверен, что дело не в том, что C ++ делает с кодом, потому что, как уже было сказано, это всего лишь подсказка.

Если вы начнете рассматривать разработку программного обеспечения, все изменится. Все изменения встроенных функций приведут к перекомпиляции всех зависимых файлов.

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

Объедините это с тем фактом, что конструкторы редко могут на самом деле указывать компилятором, тогда вы можете себе представить, почему книга дает упомянутый совет.

...