Привязки используют преимущества некоторых важных особенностей С++, таких как ссылка и директива const. Предоставляются также объявления (которые подходят ко всем классам MPI) для создания, удаления, копирования, присваивания, сравнения и смешанной работы языков.
Везде, кроме отмеченных мест, все не-статические функции-члены классов MPI (кроме конструкторов и оператора присваивания) - виртуальные функции.
Объяснение: Предоставление виртуальных функций-членов - важная часть структуры для наследования. Виртуальные функции могут быть связаны во время выполнения, что позволяет пользователям библиотек переопределить поведение объектов, уже содержащихся в библиотеке. Это вызывает небольшую потерю производительности, так как функция перед вызовом должна быть найдена. Впрочем, пользователи, заботящиеся о производительности, могут включить принудительную связку функций во время компиляции. []
Пример 8.1 - порожденный класс MPI
class foo_comm : public MPI::Intracomm {
public:
void Send(const void* buf, int count,const MPI::Datatype& type,
int dest, int tag) const
{
// функциональность класса
MPI::Intracomm::Send(buf, count, type, dest, tag);
// дальнейшая функциональность класса
}
};
Совет разработчикам: Разработчики должны соблюдать осторожность, избегая непредусмотренных побочных эффектов со стороны библиотек классов, использующих наследование, особенно многоуровневые реализации. Например, если MPI_BCAST реализован повторным вызовами MPI_SEND или MPI_RECV, поведение MPI_BCAST не может быть изменено порожденным классом коммуникатора, который мог переопределить MPI_SEND или MPI_RECV. Реализация MPI_BCAST должна явно использовать MPI_SEND (или MPI_RECV) базового класса MPI::Comm. []