The alloca module provides for a function
alloca which allocates
memory on the stack, where the system allows it. A memory block allocated with
alloca exists only until the function that calls
or exits abruptly.
There are a few systems where this is not possible: HP-UX systems, and some
other platforms when the C++ compiler is used. On these platforms the alloca
module provides a
malloc based emulation. This emulation will not free a
memory block immediately when the calling function returns, but rather will
wait until the next
alloca call from a function with the same or a
shorter stack length. Thus, in some cases, a few memory blocks will be kept
although they are not needed any more.
The user can
#include <alloca.h> and use
alloca on all platforms.
Note that the
#include <alloca.h> must be the first one after the
autoconf-generated config.h, for AIX 3 compatibility. Thanks to IBM for
this nice restriction!
Note that GCC 3.1 and 3.2 can inline functions that call
When this happens, the memory blocks allocated with
alloca will not be
freed until the end of the calling function. If this calling function
runs a loop calling the function that uses
alloca, the program easily
gets a stack overflow and crashes. To protect against this compiler behaviour,
you can mark the function that uses
alloca with the following attribute:
#ifdef __GNUC__ __attribute__ ((__noinline__)) #endif
An alternative to this module is the ‘alloca-opt’ module.