一、栈上分配对象
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在栈上分配的对象,在分配时都会调用构造函数,超出作用域时都会自动析构。
这里顺便提一下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
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++麻烦,不过这不是个推荐使用的特性,能够驾奴这个特性的人,自然不害怕这点代码。
分享到:
相关推荐
引用类型的全局变量内存分配在堆上,值类型的全局变量分配在栈上 局部变量内存分配可能在栈上也可能在堆上 堆和栈的简单说明: 1.栈(操作系统):由操作系统自动分配释放 2.堆(操作系统): 一般由程序员分配释放...
虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放...
它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则 在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾...
图文并茂的讲解了.NET(C#) 框架下的内存管理机制(堆栈、堆及垃圾回收GC)。 文档为英文文献的中文译本,全文通俗易懂。
首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是随机分配的,释放主要靠的是GC也就是垃圾回收机制。哪么有两个...
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个...
它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾...
JVM初探- 内存分配、GC原理与垃圾收集器,从从提上讲解了jvm中GC的原理、基本的算法和针对不同内存区使用的算法,同时,详细的讲解了当前主要使用的垃圾收集器
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx
JVM内存模型、堆与栈详解以及gc回收机制解析、回收方法
D78846GC20--oracle 12c administration workshop ag
Oracle Database 11g: OCM Exam Preparation Workshop D69748GC10_ag2.pdf
oracle linux 7 guide D88168GC10_ag2 , oracle linux 7 guide D88168GC10_ag2
D52163GC10 Oracle Database 11g: SQL Tuning Workshop
SENSOR_GC1054的寄存器配置以及基本图像配置
GC工业管道级别划分图.doc
369923580-D61820GC20-ag.pdf 369923880-D61820GC20-sg.pdf D61762GC31_Activity_Guide_ED3.pdf D61762GC31_Student_Kit_ED3_01.pdf D61762GC31_Student_Kit_ED3_02.pdf
Oracle Database 12c :Admin, ... D79027GC10_sg1.pdf 链接地址 https://download.csdn.net/download/snuff_914/10357720 D79027GC10_sg2.pdf 链接地址 https://download.csdn.net/download/snuff_914/10357723