Recursion in C++ should be bound, and not descend very deep -- especially when your implementation is capable of creating nontrivial stack allocations. If your program does not meet those requirements, then you should employ another approach (e.g. iterative).
Each function call requires some stack storage, and your function parameters also require stack storage. How much stack storage you get depends on your implementation/environment. Modern desktop systems will generally not give you more than a few MB. Other implementations will provide you with much less.
If your call exceeds the boundary of the thread's stack, then you will get a stack overflow.
There are some optimizations which can eliminate nesting calls in recursive functions, but your implementation should not depend on this behavior because it is unsafe (e.g. that optimization may no longer be performed after you update the compiler, change your build settings, or as your codebase evolves).