Also, in modern compilers, parameter variables are mostly passed to functions via registers, with the stack not being involved at all.
Also, in modern compilers, parameter variables are mostly passed to functions via registers, with the stack not being involved at all.
Given that this is a C++ thread I'll be pedantic and say that this is really the ABI rather than the compiler as per se.
* even interpreted ones, though the calling conventions and layout are quite different from what is typically written up in the documentation of most compiled languages.
My point was that it's not a question of whether the compiler is modern or not, i.e. I work with an old compiler backend on a modern system and it still gets the ABI correct even if it ends up spilling back to memory too often.
AFAIK (I never looked at an official standard, only at drafts) the standard doesn’t mention the word “stack” at all
A C++ compiler is free to allocate environment frames for every block on the heap.
Whether the "stack" is formalized or not, it's the mental model (and the vocabulary) that's most often used when working with this stuff. I don't think there's anything wrong with the fact that they focused on the forest and not the trees.
As is, it goes into implementation details for block scoped storage, but just posits that new and delete exist without mentioning any detail. That’s unbalanced.
Rereading it, it also assumes you know C well enough to know about malloc, so maybe, just saying “C++ can automatically do stuff when variables go out of scope or when you allocate or free memory. Here’s what it can do…” might be sufficient)
it's not a given
int algo(int*, int n);
int computation(int i, int n) {
int alloc[n];
return algo(alloc, n);
}
on some compilers (Keil for instance afair), alloc will be heap-allocated (and freed when leaving the function) even if it's "automatic storage" (what most people call the stack).Yes, the term "automatic storage" is more accurate here.