Block statements and memory management
Dennis
dkorpel at gmail.com
Sat Mar 16 10:19:16 UTC 2019
On Saturday, 16 March 2019 at 03:47:43 UTC, Murilo wrote:
> Does anyone know if when I create a variable inside a scope as
> in
> {int a = 10;}
> it disappears complete from the memory when the scope finishes?
> Or does it remain in some part of the memory? I am thinking of
> using scopes to make optimized programs that consume less
> memory.
In general, you want variables to have no larger scope than
needed, so in large functions reducing the scope may be useful.
When it comes to efficiency however, doing that is neither
necessary nor sufficient for the compiler to re-use registers /
stack space. I looked at the assembly output of DMD for this:
```
void func(int a);
void main()
{
{
int a = 2;
func(a);
}
{
int b = 3;
func(b);
}
}
```
Without optimizations (the -O flag), it stores a and b on
different places in the stack.
With optimizations, the values of a and b (2 and 3) are simply
loaded in the EDI register before the call.
Removing the braces doesn't change anything about that.
The compiler does live variable analysis [1] as well as data-flow
analysis [2] to figure out that it's only needed to load the
values 2 and 3 just before the function call. This is just a
trivial example, but the same applies to larger functions.
In any case, for better memory efficiency I'd consider looking at
reducing dynamic allocations such as new or malloc. Memory on the
stack is basically free compared to that, so even if adding lots
of braces to your code reduces stack memory, chances are it's a
low leverage point.
[1] https://en.wikipedia.org/wiki/Live_variable_analysis
[2] https://en.wikipedia.org/wiki/Data-flow_analysis
More information about the Digitalmars-d-learn
mailing list