Steven Schveighoffer wrote:
On Tue, 09 Nov 2010 17:14:33 -0500, Don <nos...@nospam.com> wrote:
bearophile wrote:
Jonathan M Davis:
it would be possible to make it so that any objects allocated with
new during CTFE would be in the dynamic heap during runtime.
This is possible, but it doesn't seem what you usually desire when
you allocate an object at compile time.
Bye,
bearophile
If it's mutable, it'll go on the heap. If it's immutable, it could
optionally go into read-only memory (it will be exactly like the .init
of a class instance). Classes which are used only during execution of
CTFE functions will not be instantiated at runtime.
Pardon my ignorance, but how can something evaluated at compile time go
on the heap? The heap doesn't exist yet!
e.g.:
class C
{
int[] buffer;
this() pure { buffer = new int[125];}
}
C c = new C;
How does c go on the heap at compile time? Won't you have to re-run the
constructor at runtime to get the right result? Not only that, but even
if you did run the ctor at compile time, how do you make a copy of c for
every thread without re-running the ctor?
-Steve
The situation isn't any different to what we already have. You can
already do:
struct F
{
int [] w;
}
F[] foo() {
F[] x = new F[6];
foreach(i; 0..x.length)
x[i].w = new int[20];
return x;
}
and foo() can be run at compile time.
OTOH, I don't know if there is any case where a CTFE value can actually
end up on the heap at runtime. CTFE only kicks in when you need a
manifest constant, and AFAIK there's no way to require a class manifest
constant -- just an element of one.