When this will be freed?
Marc Schütz" <schuetzm at gmx.net>
Marc Schütz" <schuetzm at gmx.net>
Sat Apr 5 06:08:35 PDT 2014
On Saturday, 5 April 2014 at 11:28:36 UTC, Jacob Carlborg wrote:
> On 2014-04-04 15:25, "Marc Schütz" <schuetzm at gmx.net>" wrote:
>
>> This is unfortunately only true on x86 32-bit. For x86_64, the
>> calling
>> conventions (MS, SysV [1]) say that the first few parameters
>> are passed
>> in registers, and the same is probably true for other
>> architectures.
>
> I'm not so familiar with calling conventions and how the stack
> and registers work. But take this as an example:
>
> extern (C) void foo (in char*);
>
> void bar ()
> {
> string s = "asd";
> foo(s.ptr);
> }
>
> Even if "s" is passed in a register to "foo", won't the stack
> of "bar" still be available until "foo" returns?
Yes, but it doesn't necessarily contain `s` anymore. Today's
compilers are intelligent enough to see that `s` is never used
after the function call, and therefore don't even allocate a
stack slot for it.
`foo` could be implemented like this (it's a C function, so `in`
boils down to `const` without `scope`):
char *b;
void foo (const char *a) {
b = a;
// do something complex that causes all the registers to be
reused
// => the only reference to the string is now in b, outside
of the GC's view
// --> GC collects here <--
printf(b); // the string may have been collected here
}
More information about the Digitalmars-d-learn
mailing list