Позвольте мне привести пример, основанный на опыте. Большинство библиотек, которые я использую изо дня в день, так или иначе используют ООП. ООП способен скрыть сложность, необходимую для многих доменов, это не тот механизм, который действительно помогает с производительностью. Может случиться так, что библиотека может использовать определенные оптимизации, основанные на иерархии объектов, но по большей части это скрытие сложности от пользователя. Посмотрите шаблоны проектирования, они являются механизмами, часто используемыми для выполнения этой сложности сокрытия.
Возьмите PETSc в качестве примера. PETSc использует модель инспектора / исполнителя OOP, где любой из его алгоритмов просматривает доступные подпрограммы в данном объекте и выбирает, какие из них выполнить для выполнения подпрограммы. Это позволяет пользователю разделять задачи, например, действие матрицы может включать в себя любые виды заблокированных или оптимизированных процедур и эффективно использоваться многочисленными итерационными решателями. Предоставляя пользователю возможность указывать свои собственные типы данных и оценки, они ускоряют несколько важных подпрограмм, а также все функциональные возможности библиотеки остаются доступными.
Другой пример, который я приведу, это FEniCS и deal.II. Обе эти библиотеки используют ООП для обобщения большого числа методов конечных элементов. И то, и другое: тип элемента, порядок элемента, квадратурное представление и т. Д. Взаимозаменяемы. Хотя обе эти библиотеки «медленнее», чем некоторые специализированные структурированные коды FEM, они способны решать самые разнообразные проблемы, причем большая часть сложности FEM неизвестна пользователю.
Мой последний пример - Элементаль. Elemental - это новая библиотека плотной линейной алгебры, которая взяла на себя сложность управления коммуникаторами MPI и определения местоположения данных до очень простой языковой конструкции. В результате, если у вас есть серийный код FLAME, изменив типы данных, вы также можете получить параллельный код через Elemental. Еще интереснее можно поиграть с распределением данных, установив на распределение равное другому.
ООП следует рассматривать как способ управления сложностью, а не парадигму для конкуренции с ручной сборкой. Если вы сделаете это плохо, это приведет к большим накладным расходам, поэтому нужно следить за временем и обновлять механизмы, с которыми они его используют.