发新话题
打印

[转载D语言文档] D语言在栈上分配对象以及无需GC拖管对象

D语言在栈上分配对象以及无需GC拖管对象

知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070428

点击下面网址查看原文:
http://www.d-programming-language-china.org

by: qiezi
from: http://qiezi.javaeye.com/blog/36332

一、栈上分配对象

C++可以轻易实现在栈上和堆上分配对象,例如下面的代码:

代码

class Foo{};

Foo foo;    //在栈上分配
Foo* foo = new Foo; //在堆上分配

在栈上分配对象是C++相较于java的一大优势,可以轻松实现RAII。

D语言也可以实现这2种分配方式:

Foo foo = new Foo; // 在GC堆上分配
scope Foo foo = new Foo; // 在栈上分配

C++和D在栈上分配的对象,在分配时都会调用构造函数,超出作用域时都会自动析构。( 本文出处: http://www.d-programming-language-china.org )

这里顺便提一下0.175版以前,D的栈上对象的一个小陷阱:

scope Foo foo1 = new Foo;
scope Foo foo2 = new Foo;
scope Foo foo3 = foo1;

用了3个scope关键字,但实际上只有2个对象需要。0.175版以前,对象实际上是分配在堆上的,程序会死锁在这里。0.175版的scope对象真正在栈上分配,这个BUG也改掉了。

二、无需GC拖管的对象

C++除了在栈上和堆上分配对象以外,还支持一种由用户分配空间的方式,用户需要分配出一段内存空间,并且自己调用placement new。

char* mem = new char[sizeof(Foo)];
Foo* foo = new(mem)Foo;
foo->~Foo();
delete[] mem;

D语言同样支持这种低层操作,以下代码摘自: http://www.digitalmars.com/techtips/class_objects.html( 本文出处: http://www.d-programming-language-china.org )

import std.c.stdlib;
import std.outofmemory;

// This is part of the D internal runtime library support
extern (C) void _d_callfinalizer(void *p);

class Foo
{
    this(int x, char c) { ... }
    ~this() { ... }
}

Foo alloc_Foo(int x, char c)
{
    ClassInfo ci = Foo.classinfo;
    Foo f;
    void *p;

    p = std.c.stdlib.malloc(ci.init.length);
    if (!p)
    std.outofmemory._d_OutOfMemory();

    // Initialize it
    (cast(byte*)p)[0 .. ci.init.length] = ci.init[];

    f = cast(Foo)p;

    // Run constructor on it
    f._ctor(x, c);

    return f;
}

void free_Foo(Foo f)
{    void* p = cast(void*)f;

    if (p)
    {
    _d_callfinalizer(p);    // call destructor
    std.c.stdlib.free(p);
    }
}

这在实现对象池或自定义GC时可能有帮助。使用上比C++麻烦,不过这不是个推荐使用的特性,能够驾奴这个特性的人,自然不害怕这点代码。

( lastupdate:20070428 最新文章请访问http://www.d-programming-language-china.org )

关于一大步成功社区:
yidabu提倡在交流中学习,在分享中提高
收集感兴趣的知识,写下心得,通过网络与别人一起分享
理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的
网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台

TOP

发新话题