Параллельное программирование: Учебное пособие, страница 53

13.  Для каких соотношений (время вычислений)/(время взаимодействия) имеет смысл распараллеливать решение громоздкой задачи?


3  Язык программирования СС++

Универсальный язык программирования СС++ (Compositional C++) является расширенным вариантом языка программирования С++ ориентированным на программирование задач для многопроцессорных вычислительных систем с распределенной и разделяемой памятью и развитой внутренней и внешней коммуникационной средой. В него включены специальные конструкции для описания взаимодействующих процессов, расположенных на одном и на разных процессорах, конструкции для определения и указания места нахождения процессов, их порождения и запуска, а также для построения и настройки коммуникационной среды для обмена данными. Эти нововведения позволяют в параллельных программах участки последовательных, параллельных и взаимодействующих программных секций оттранслировать в СС++ по частям.

3.1  Краткий обзор C++

Из основных конструкций C++ рассмотрим лишь те, которые использованы в приведенных ниже примерах на языке СС++. Предполагается, что конструкции базового языка С читателю известны. За незначительными исключениями С++ является расширением языка С ANSI (American National Standards Institute – Американский национальный институт стандартов) [10, 11]. Правильные программы, написанные на базовом языке С имеют силу и в С++. В последнем добавлен строгий контроль типов и обеспечена языковая поддержка абстракции данных и объектно-ориентированного программирования.

3.1.1  Строгий контроль типов и управление памятью

Стандарт C ANSI вводит функциональные прототипы в языке C. Функциональный прототип определяет тип каждого функционального параметра и возвращаемого значения функции (функциональную сигнатуру). Например:

/* Объявление функции с именем  a_function  имеет такой вид */

int a_function(float b, double c);

/* Определение функции с именем  a_function  с ее описанием */

int a_function(float b, double c) {...  /* Тело функции */ }

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

В программах на C, библиотечные подпрограммы malloc и free используются для динамического распределения памяти. В C++ определены два дополнительных оператора, new и delete, использование которых можно проиллюстрировать следующими кодовыми фрагментами:

Struct S            /* Определение структуры */

{

. . .        /* Тело Структуры */

};

S *sPtr = new S;      /* Распределение образца структуры S */,

delete sPtr;          /* Удаление из памяти образца S */

/* Распределение массива */

IntiPtr = newint[25];       /* целых чисел */,

delete[] iPtr;            /* Удаление образца массива чисел */

Оператор new передает описание типа данных исходного объекта  (структуры S – в первом случае, целочисленного массива int[25] – во втором) указателю *iPtr на динамически распределенные данные соответствующих типов. Этим объектам выделяется область памяти, начальный адрес которой записан в указатель *iPtr. Оператор delete освобождает динамически распределенную память, устраняя связь между объектом и его образцом. Выбор момента, когда массив объектов должен быть «стерт», является обязанностью программиста.

3.1.2  Классы

Наиболее значительной особенностью языка C++, которая отличает его от C, является встроенная концепция классов. Понятие класса можно представить как некое обобщение понятия структуры в C. В базовом языке C структурная группа вместе с элементами данных различных типов выступает под единым именем, а в C++ структуры дополнительно могут включать еще и функции принадлежности к классу. К функциям, являющимся членами класса, можно обращаться только посредством указателя на объект соответствующего типа. Класс в C++ определяет порядок построения конкретных имен функций и данных, которые в дальнейшем составляют новый тип объектов. Классы в C вводятся при помощи ключевых слов struct и union, а в C++ – ключевым словом class.