Как я понимаю, вас больше всего беспокоит время сборки и ремонтопригодность вашей библиотеки?
Во-первых, не пытайтесь "исправить" все сразу.
Во-вторых, пойми, что ты исправляешь. Сложность шаблона часто возникает по какой-либо причине, например чтобы обеспечить определенное использование, и заставить компилятор помочь вам не ошибиться. Эту причину иногда можно увести далеко, но отбрасывать 100 строк, потому что «никто не знает, что они делают», не следует воспринимать легкомысленно. Все, что я предлагаю здесь, может привести к действительно неприятным ошибкам, вы были предупреждены.
В-третьих, сначала рассмотрите более дешевые исправления: например, более быстрые машины или распределенные инструменты сборки. По крайней мере, добавьте всю оперативную память, которую возьмут платы, и выбросьте старые диски. Это делает разницу. Один диск для ОС, один диск для сборки - это дешевый мужской RAID.
Хорошо ли задокументирована библиотека? Это ваш лучший шанс сделать это. Найдите такие инструменты, как doxygen, которые помогут вам создать такую документацию.
Все считали? Хорошо, теперь некоторые предложения по времени сборки;)
Понимание C ++ модели сборки : каждый .cpp компилируется индивидуально. Это означает, что много .cpp файлов с большим количеством заголовков = огромная сборка. Однако это НЕ совет, чтобы поместить все в один файл .cpp! Однако, одна хитрость (!), Которая может значительно ускорить сборку, - это создать один файл .cpp, который включает в себя кучу файлов .cpp, и передавать только этот «главный» файл компилятору. Вы не можете делать это вслепую - вам нужно понимать типы ошибок, которые это может привести.
Если у вас его еще нет, получите отдельную машину для сборки , к которой вы можете подключиться. Вам нужно будет сделать много почти полных сборок, чтобы проверить, не сломались ли некоторые из них. Вы захотите запустить это на другой машине, которая не мешает вам работать над чем-то другим. В долгосрочной перспективе она понадобится вам для ежедневных интеграционных сборок;)
Использовать предварительно скомпилированные заголовки . (лучше масштабируется на быстрых машинах, см. выше)
Проверьте политику включения заголовка . Хотя каждый файл должен быть «независимым» (т. Е. Включать в себя все, что ему нужно, чтобы кто-то еще его включил), не включайте его свободно. К сожалению, я еще не нашел инструмент для поиска ненужных операторов #incldue, но он может помочь потратить некоторое время на удаление неиспользуемых заголовков в файлах «горячей точки».
Создание и использование предварительных объявлений для шаблонов, которые вы используете. Часто вы можете включить заголовок с объявлениями forwad во многих местах и использовать полный заголовок только в нескольких конкретных. Это может очень помочь компилировать время. Проверьте заголовок <iosfwd>
, как стандартная библиотека делает это для потоков ввода / вывода.
перегрузки для шаблонов для нескольких типов : Если у вас есть шаблон сложной функции, который полезен только для очень немногих типов, таких как:
// .h
template <typename FLOAT> // float or double only
FLOAT CalcIt(int len, FLOAT * values) { ... }
Вы можете объявить перегрузки в заголовке и переместить шаблон в тело:
// .h
float CalcIt(int len, float * values);
double CalcIt(int len, double * values);
// .cpp
template <typename FLOAT> // float or double only
FLOAT CalcItT(int len, FLOAT * values) { ... }
float CalcIt(int len, float * values) { return CalcItT(len, values); }
double CalcIt(int len, double * values) { return CalcItT(len, values); }
это перемещает длинный шаблон в одну единицу компиляции.
К сожалению, это только ограниченное использование для классов.
Проверьте, может ли идиома PIMPL перемещать код из заголовков в файлы .cpp.
Общее правило, за которым скрывается , отделяет интерфейс вашей библиотеки от реализации . Используйте комментарии, detail
namesapces и отдельные .impl.h
заголовки, чтобы мысленно и физически изолировать то, что должно быть известно извне, от того, как это достигнуто. Это раскрывает реальную ценность вашей библиотеки (действительно ли она инкапсулирует сложность?) И дает вам возможность сначала заменить «легкие цели».
Более конкретный совет - и насколько он полезен - во многом зависит от фактической библиотеки.
Удачи!