Usually the biggest motivator for building a custom allocator has nothing to do with performance. Instead programs that need to run on a wide variety of systems run into inconsistent, and/or incomplete libraries. The std lib in particular. Additionally, hardware limitations on embedded systems frequently require applications to be very careful about memory usage and management. These programs run everything from the AC in your car, to the auto pilot on airplanes. There are also systems that don't have a stack requiring careful management of the heap. These examples are just the tip of the iceberg. Couple that with a basic allocator, like one of the many stack based designs, and you get a very simple to write, easy to maintain and highly performant solution. Yet another reason to write your own allocator is very simply running out of memory. This one usually comes up when there is plenty of "free" memory, but no blocks large enough to fill a request. Meaning memory has become fragmented within the allocator. Google "facebook memory allocator" for an example.
The one common theme among all these programs is a need for a solution specific memory manager. This is the reason there are so many freely available managers. If there is no specific need then there is no good reason to use anything other then malloc/new. Or, even better making a policy that requires the use of smart pointers that handle memory allocations behind the scenes. Memory profiling and statisics is easily done with an external tool and is usually the first step programmers take on the path to a solution specific memory manager. You should never start out with a "generic memory manager" and then later ask "why am i using this".
Finally your use of the term "storage manager" refers to a much broader class of tools that usually manage data from short term memory to long term storage and archiving. These tools are much more rare, can be highly complex and, again, are a solution specific tool that needs to be used for specific needs such as a database.
Performance is usually the last reason to include a memory manager in a program, that being said, if a memory manager can't out perform the system by at least a factor of 2 then something is seriously wrong. Either the program has found a degenerate case for the manager, or the manager itself has an issue that needs addressing.
malloc()andnew()aren't system calls. Lower-level things likemmapandbrk()are. - S.S. Annemmap()orbrk(). For example, theopen()"system call" is a function that can wrap anopenat()system call. I personally detest the artificial and misleading division of library functions into "functions" and "system calls". - Andrew Henlebrk(), notbreak()). - S.S. Anne