Standard subscriptions do not buffer any values. Some operators (and subjects) do need to buffer some values to implement their behaviour (and that buffer can be unbounded) but that is a problem distinct from the hot vs. cold dichotomy.
The short explanation is that the (cold) source observable (the most upstream observable) knows how to generate its values but only does so when he has a subscriber. And he generates the same values for all subscribers. So there is no buffering, more like regeneration of values. For instance, Rx.Observable.range(1,10)
knows which values it has to generate, and generate them anytime there is a subscriber. It does not keep a buffer with 1,2,3...10
in memory, just 1
and 10
and iterates in between to generate the values. Same goes for most of cold observables, they have a value generating function associated to them, and that function is reexecuted anew for each subscriber.
If you want to switch to a behaviour for observables in which they push their values as soon as they receive/generate them, to all existing subscribers at the moment of reception/generation, you have to convert your cold observable to a hot one.
For a more in-depth explanation, have a look at the illustrated subscription and data flows corresponding to hot and cold observables.