Reuse object memory?
Namespace via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Apr 20 12:05:24 PDT 2015
On Sunday, 19 April 2015 at 21:17:18 UTC, Ali Çehreli wrote:
> On 04/19/2015 09:04 AM, Namespace wrote:
>
> > Is it somehow possible to reuse the memory of an object?
>
> Yes, when you cast a class variable to void*, you get the
> address of the object.
>
> > @nogc
> > T emplace(T, Args...)(ref T obj, auto ref Args args) nothrow
> if (is(T ==
> > class)) {
>
> There is already std.conv.emplace:
>
> import std.conv;
> import core.memory;
>
> class Foo
> {
> int i;
>
> this(int i)
> {
> this.i = i;
> }
> }
>
> void main()
> {
> void* buffer = GC.calloc(1234);
>
> enum FooSize = __traits(classInstanceSize, Foo);
>
> /* These two object are constructed on a void[] slice: */
> auto f = emplace!Foo(buffer[0..FooSize], 42);
> auto f2 = emplace!Foo(buffer[0..FooSize], 43);
>
> /* f3 is constructed on top of an existing object: */
> auto f2_addr = cast(void*)f2;
> auto f3 = emplace!Foo(f2_addr[0..FooSize], 44);
>
> /* At this point, all three reference the same object: */
> assert(&f.i == &f2.i);
> assert(&f.i == &f3.i);
> }
>
> Ali
I'm sorry if I annoy you, but I would really like to know how you
would reuse already instantiated storage of an existing object.
Example code:
----
final class Foo {
uint id;
@nogc
this(uint id) {
this.id = id;
}
}
Foo f = new Foo(42);
----
More information about the Digitalmars-d-learn
mailing list