The enable_shared_from_this helper contains a weak pointer that is set when creating shared pointer to the object. That means there is the reference-count (allocated separately or together with the object using make_shared) and an extra weak_ptr in the object.
Now why doesn't it simply contain the reference count instead? When setting shared_ptr from dumb pointer, the type has to be fully defined, so the shared_ptr constructor or assignment operator can detect the type is derived from enable_shared_from_this and use the correct counter and the format can remain the same, so copying does not care. In fact, the shared_ptr already has to detect it to set the embedded weak_ptr.
The first thing that comes to mind is whether that approach would be feasible at all, and the answer is that it would not:
If the count is stored in the object, then no
weak_ptrcan outlive the object, which is a breach in the contract. The whole idea ofweak_ptris that they can outlive the object (if the lastshared_ptrgoes out of scope, the object is deleted even if there areweak_ptr)