Короче говоря:
Да, этот подход [вероятно] будет работать в ограниченных, специализированных условиях. Я не подозреваю, что std::vector
(или остальная часть STL) относятся к таким обстоятельствам.
Длинна этого:
Как уже упоминали другие (и я согласен), вне встроенной системы, раздувание кода не является большой проблемой для скомпилированного двоичного файла.
Но многие из нас несут затраты на компиляцию, из-за которых на этапе компиляции создается больше кода, чем мы могли бы, если бы существовали скомпилированные библиотеки для ссылки (вместо компиляции заголовочных файлов). Добавьте к этому сложность изменения одного из этих шаблонных заголовочных файлов и наблюдайте, как весь ваш проект перекомпилируется с нуля. Длинные времена компиляции делают для печальных разработчиков: (
Это может не повлиять на большой процент разработчиков - в зависимости от размера кодовой базы вашей компании и от того, как вы структурируете среду сборки. Это, конечно, облагает нас налогами в моей компании.
Как указывалось в некоторых ответах, нечего абстрагироваться от std::vector
, который мог бы сделать его более справедливым в вашем примере. Конечно, вам нужно иметь возможность создавать и уничтожать отдельные элементы, и любые методы virtual
будут препятствовать производительности во время выполнения (что более важно, чем производительность во время компиляции). Кроме того, компилятор потеряет способность оптимизировать библиотеку void*
для шаблонного кода, что может привести к значительной потере производительности.
Меня больше интересуют более сложные структуры - выиграет ли std::map
от абстракции? Что если вы взяли красно-черное дерево (реализацию SGI) и соединились с библиотекой красно-черного дерева. Вам (вероятно) нужно хранить элементы вне std::map
, поэтому не нужно вызывать деструкторы, но это может (опять же) привести к потере производительности во время выполнения из-за удвоения вашей косвенности.
Я вполне уверен, что вы не могли использовать этот метод для улучшения реализации STL.
Если бы вы лучше знали структуры данных, которые вы хранили, или у вас был очень специфический шаблонный тип (не обязательно контейнер), вы, вероятно, могли бы улучшить свою производительность. Но тогда возникает вопрос - как часто вы будете использовать этот новый шаблонный тип, так что накладные расходы на его компиляцию будут заметно улучшены? Конечно, это поможет компилировать время для std::vector
, но, возможно, не для my_domain_specific_ptr_container
. Если вы сэкономите 50% времени компиляции для my_domain_specific_ptr_container
, сколько раз вам придется использовать его, чтобы заметить достаточно значительное ускорение сборки, чтобы оправдать добавленную сложность для класса (и уменьшенную возможность отладки).
Если вы еще этого не сделали, ваше время может быть лучше потрачено на распространение инструментов сборки:)
Если, с другой стороны, вы попробуете это, и это будет работать для контейнеров STL ... пожалуйста, отправьте сообщение обратно. Я хочу быстрее построить! ;)