D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: D语言在栈上分配对象以及无需GC拖管对象

yidabu 2007-4-28 18:52

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++可以轻易实现在栈上和堆上分配对象,例如下面的代码:        代码        [Copy to clipboard] [ - ]CODE:                                class Foo{};                                Foo foo;    //在栈上分配                Foo* foo = new Foo; //在堆上分配                在栈上分配对象是C++相较于java的一大优势,可以轻松实现RAII。        D语言也可以实现这2种分配方式:        [Copy to clipboard] [ - ]CODE:                                Foo foo = new Foo; // 在GC堆上分配                scope Foo foo = new Foo; // 在栈上分配                C++和D在栈上分配的对象,在分配时都会调用构造函数,超出作用域时都会自动析构。( 本文出处: http://www.d-programming-language-china.org )        这里顺便提一下0.175版以前,D的栈上对象的一个小陷阱:        [Copy to clipboard] [ - ]CODE:                                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。        [Copy to clipboard] [ - ]CODE:                                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 )        [Copy to clipboard] [ - ]CODE:                                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为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: D语言在栈上分配对象以及无需GC拖管对象