in / out for C++ programmers
Jonathan M Davis
jmdavisProg at gmx.com
Fri Mar 23 23:50:37 PDT 2012
On Friday, March 23, 2012 23:37:27 Ali Çehreli wrote:
> 'in' is the same as 'const scope'. const part is easy to understand but
> I don't know what 'scope' does. I could not understand what the spec
> means with "references in the parameter cannot be escaped (e.g. assigned
> to a global variable)" for scope:
>
> http://dlang.org/function.html
You mean that you don't understand what it means for a reference to escape a
function? One example of this with pointers would be
int* func()
{
int a;
return &a;
}
A pointer to a local variable has escaped the function. That pointer is
invalid. A case this simple gets caught by the compiler, but it's very easy
to get around that (e.g. passing &a to a function which returns it and then
return the result of that function rather than &a directly).
In the case of scope, it means that what you pass in cannot be assigned to a
global or static variable, and it cannot be returned from that function. So,
for instance.
int[] foo(const int[] a)
{
...
}
could not assign a to a global or static variable and cannot return it. This
can allow some additional optimizations as well as improve safety in some
cases. For instance, if you pass
int[5] b;
to foo, then you know that no slice of that static array will escape, since
something like
int[] bar()
{
int[5] c;
return c;
}
is just as bad as the case with &a. I believe that scope is used primarily
with delegates however (particularly, since you often _want_ to be able to
return a slice of an array passed to a function). It guarantees that the the
delegate's context won't escape the function and can make it so that the
delegate's context doesn't have to be allocated on the heap, which improves
efficiency.
scope is pointless with types which aren't pointers or references though.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list