Почему контейнеры STL не имеют виртуальных деструкторов?

Если необработанная сетевая производительность является целью, то ничто не бьет IIOP (см. RMI/IIOP). Самое маленькое место - только двоичные данные, никакая разметка вообще. Сериализация/десериализация очень быстра также.

, Так как это - IIOP (который является CORBA), почти все языки имеют привязку.

, Но я предполагаю, что производительность не [только 113] требование, правильно?

31
задан Community 23 May 2017 в 11:54
поделиться

6 ответов

Я полагаю, это следует философии C ++ - не платить за функции, которые вы не используете. В зависимости от платформы указатель на виртуальную таблицу может быть дорогой ценой, если вам не нужен виртуальный деструктор.

12
ответ дан 27 November 2019 в 22:03
поделиться

Виртуальный деструктор полезен только для сценариев наследования. Контейнеры STL не предназначены для наследования (и это не поддерживаемый сценарий). Следовательно, у них нет виртуальных деструкторов.

30
ответ дан 27 November 2019 в 22:03
поделиться

Как уже отмечалось, контейнеры STL не предназначены для наследования. Нет виртуальных методов, все элементы данных являются частными, нет защищенных геттеров / сеттеров / помощников ... И, как вы обнаружили, нет виртуальных деструкторов ...

Я бы посоветовал вам действительно использовать контейнеры через композицию, а не реализацию наследование по принципу «имеет», а не «есть».

1
ответ дан 27 November 2019 в 22:03
поделиться

Я думаю, что Страуструп косвенно ответил на этот вопрос в своей фантастической статье: Почему C ++ не просто объектно-ориентированный язык программирования :

7 Заключительные замечания
Различны ли объекты, представленные выше объектно или нет? Какие? Используя какое определение объектно-ориентированный? В большинстве случаев я думаю, что это неправильные вопросы. Важно то, какие идеи вы можете ясно выразить, как легко ты можешь комбинировать софт из разных источники, и насколько эффективны и поддерживаемые результирующие программы являются. Другими словами, как вы поддерживаете хорошие методы программирования и хорошие методы дизайна имеют большее значение, чем ярлыки и модные слова. Фундаментальный идея - просто улучшить дизайн и программирование через абстракцию. Вы хотите скрыть детали, вы хотите использовать любую общность в системе, и вы хотите сделать это доступным. Я хотел бы призвать вас не сделать объектно ориентированным бессмысленным срок. Понятие «объектно-ориентированный» слишком часто унижается

- приравнивая его к добру,

- приравнивая это на одном языке, или

- на принимая все как объектно ориентированный.

Я утверждал, что есть - и должны быть - полезные методы, выходящие за рамки объектно-ориентированного программирование и дизайн. Однако чтобы не быть полностью непонятым, я хочу подчеркнуть, что я не стал бы заниматься серьезным проектом используя язык программирования, который по крайней мере не поддерживал классический понятие объектно-ориентированного программирования. В дополнение к объектам, поддерживающим объектно-ориентированное программирование, хочу - и C ++ предоставляет - функции, которые помимо тех, кто поддерживает прямое выражение концепций и

STL был построен, главным образом, с учетом трех концептуальных инструментов. Общее программирование + функциональный стиль + абстракция данных == стиль STL . Неудивительно, что ООП - не лучший способ представления библиотеки структур данных и алгоритмов. Хотя ООП используется в других частях стандартной библиотеки, разработчик STL увидел, что сочетание трех упомянутых методов лучше, чем одно ООП . Короче говоря, библиотека не была разработана с учетом ООП, и в C ++, если вы ее не используете, она не будет связана с вашим кодом. Вы не платите за то, чем не пользуетесь. Классы std :: vector, std :: list, ... являются не концепциями ООП в смысле Java / C #. Это просто абстрактные типы данных в наилучшей интерпретации.

17
ответ дан 27 November 2019 в 22:03
поделиться

Никакой виртуальный деструктор не препятствует правильному созданию класса подклассами.

-2
ответ дан 27 November 2019 в 22:03
поделиться

вы не должны слепо добавлять виртуальный деструктор к каждому классу. Если бы это было так, язык не позволил бы вам другого выбора. Когда вы добавляете виртуальный метод в класс, у которого нет других виртуальных методов, вы просто увеличиваете размер экземпляров класса на размер указателя, обычно 4 байта. Это дорого, в зависимости от того, что вы делаете. Увеличение размера происходит потому, что создается v-таблица для хранения списка виртуальных методов, и каждому экземпляру требуется указатель обратно на v-таблицу. Обычно он находится в первой ячейке экземпляра.

1
ответ дан 27 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: