The GMP types like
mpz_t are small, containing only a couple of sizes,
and pointers to allocated data. Once a variable is initialized, GMP takes
care of all space allocation. Additional space is allocated whenever a
variable doesn't have enough.
mpq_t variables never reduce their allocated space.
Normally this is the best policy, since it avoids frequent reallocation.
Applications that need to return memory to the heap at some particular point
mpz_realloc2, or clear variables no longer needed.
mpf_t variables, in the current implementation, use a fixed amount of
space, determined by the chosen precision and allocated at initialization, so
their size doesn't change.
All memory is allocated using
malloc and friends by default, but this
can be changed, see Custom Allocation. Temporary memory on the stack is
also used (via
alloca), but this can be changed at build-time if
desired, see Build Options.