原文
概述
当前只允许在GC
堆上分配new
符号.使用原位新
式,新符号
可在任意位置初化对象
.它替换了core.lifetime.emplace
函数.
理由
在GC
堆上分配现有新符号
,或,如果它正在初化
有域
属性的类对象
,则在栈
上分配
.不能与malloc()
或其他存储分配器
分配的存储
一起使用它
.
也不能用它来初化数组中的槽
.
为此,创建了core.lifetime.emplace
.它有效.但它也有一些缺点
:
1,这很复杂
2,它模拟
编译器初化对象
,如:
core.lifetime.copyEmplace(s, t);
模拟:
S s = t;
3,编译器
不知道原位
作用,因此不能利用生命期等信息
.
4,CTFE
引擎也不知道原位
的干了啥,并扩展模板
来模拟它
,这使得简单的操作
变慢且消费大量内存
.
5,如果想使用如在BetterC
中的没有GC
的类,则使用原位
会很尴尬
.
先前的工作
d运行时
位置:这里
C++
版本新:这里
描述
NewExp
的当前语法
为:
NewExpression:
new Type
new Type [ AssignExpression ]
new Type ( NamedArgumentList opt )
NewAnonClassExpression
NewAnonClassExpression:
new class ConstructorArgs opt AnonBaseClassList opt AggregateBody
修改它
以包含可选
的PlacementExpression
前缀:
NewExpression:
new PlacementExpression opt Type
new PlacementExpression opt Type [ AssignExpression ]
new PlacementExpression opt Type ( NamedArgumentList opt )
NewAnonClassExpression
NewAnonClassExpression:
new PlacementExpression opt class ConstructorArgs opt AnonBaseClassList opt AggregateBody
PlacementExpression:
( AssignExpression )
如果类型
是一个类
,则PlacementExpression
必须生成void[]
类型的值
,且数组
必须有足够的大小
来保存类对象
.
可用__traits(initSymbol,Type).length
式来取类
类型的内存对象
的大小
.
否则,PlacementExpression
必须生成指向一个放入新对象
的内存对象
的Type*
类型的值
.