Stack storage is automatically managed for data local to function calls, while heap storage is dynamically allocated using operators like new. Global objects are stored in static storage, which is fixed for the program duration. The compiler determines storage location - automatic storage is used by default for local variables, while static specifies static storage for global and local static objects. Dynamic storage is allocated at runtime using operators like new.