A group is an ordered set of process identifiers (henceforth processes); processes are implementation-dependent objects. Each process in a group is associated with an integer rank. Ranks are contiguous and start from zero. Groups are represented by opaque group objects, and hence cannot be directly transferred from one process to another. A group is used within a communicator to describe the participants in a communication ``universe'' and to rank such participants (thus giving them unique names within that ``universe'' of communication).
There is a special pre-defined group: MPI_GROUP_EMPTY, which is a group with no members. The predefined constant MPI_GROUP_NULL is the value used for invalid group handles.
 Advice to users.
MPI_GROUP_EMPTY, which is a valid handle to an empty group,
should not be confused with MPI_GROUP_NULL, which in turn is
an invalid handle. The former may be used as an argument to group
operations; the latter, which is returned when a group is freed, in not
a valid argument.
( End of advice to users.)
 Advice to implementors.
A group may be represented by a virtual-to-real process-address-translation table. Each communicator object (see below) would have a pointer to such a table.
Simple implementations of MPI will enumerate groups, such as in a
table. However, more advanced data structures make sense in order
to improve scalability and memory usage with large numbers of processes.
Such implementations are possible with MPI.
( End of advice to implementors.)