d栈上的类

原文
想在上声明类.
可用scope存储类,参考

void main() @nogc
{
    scope o = new Object();
}

@nogc属性确保不使用垃集分配.
@nogc属性由编译器强制保证没有堆分配,因此如果此处不使用带scopenew,就会报错.

GC.disable()是丑陋的.

只要想用类和Phobos等等,你就会被GC卡住并激活垃集.
D的运行时包括许多如在执行main前初化线程的基础设施.
可用GC.disable等等来限制GC活动,但它仍会在某处激活.
D的GC是你的朋友,如果不分配它就不会收集,除非你想要它.

想避免D运行时,请使用betterC.

有一些状态如GC和线程,直到内核进程结束才会释放.
它不是内存泄漏,它只是长期存在内部状态.
对于D中的大多数人来说,它在堆栈上,GC分配或引用计数.这三种策略几乎可以保证没有泄漏.
确定需要类并且不能使用结构吗?

如果有子类的最大大小,也可在堆栈上的字节数组中放置任何层次结构实例.
有一些方法可把类放入堆栈(std.typecons.scoped,emplace()...),但不是完全多态的类.

结构完全支持模板,支持struct S(T){...}.
没有继承,但是可用别名本来欺骗它.
作为BetterC的替代方案,还可编写自己的运行时.
自定义运行时参考.
运行时在运行main前会分配.但这些都是Cmalloc分配,而不是GC分配.这些程序中的GC使用率应该为零.

分配的72个字节用于注册甚至在C的main运行前运行的手动GC.
分配24个字节是为了在初化运行时中添加区间.
注意,在使用GC实际分配东西前,它未被初化.相反,它只是直到真正GC建立时,专门分配该区间的对象.这不是泄漏,因为程序退出时,它仍在使用中.

如在栈上分配类,类的构造函数,仍将在堆上分配,基本上只有顶级类会在栈上.

最近,Discord社区中有人寻求帮助,追踪他们使用GC的D项目中的内存泄漏.
经过调查,事实证明泄漏来自C库,它持有的手动分配数据比预期的要长.为了释放它,用户必须调用额外库函数来指示不再需要数据.
故事寓意:如果担心内存泄漏,GC是朋友,而不是敌人.😃

import std.stdio;

class A {
  int i;
}

class B {
  A a;
  int i;

  this() {
    this.a = new A();
  }
}

void main() {
  scope b = new B();
  int i;

  writeln("在栈上: ", &i);
  writeln("在栈上: ", &b.i);
  writeln("在堆上: ", &b.a.i);
}

scope this.a = new A();呢?
它不会编译.
如果想要所有内容都在栈中,则必须传入a作为参数,如下所示:

class A {}

class B {
  A a;

  this(A a) {
    this.a = a;
  }
}

void main() {
  scope a = new A(); //栈上
  scope b = new B(a);//栈上
}

之前看到给类中成员分配空间的例子,可惜找不到(见下面链接).然后它跑emplace来运行构造函数.这样就不必在顶级栈外分配它,当有很多成员时这很烦人.

我个人参与的分配模块排序算法(用于检测循环和正确排序模块ctor/dtor).它分配释放临时结构来有向图排序.
rt_init分配,应由rt_term释放,但不是.

我希望可避免运行时模块构造函数排序,因为每次都是一样的,并且会浪费CPU周期.但这只能在链接后完成.如果可为模块ctor循环顺序,预先分配空间,然后在后构建编辑该图,那将是很大改进.

-profile=gc可跟踪GC分配.
数据不会从一次运行到下一次发生变化,而是无序存储,然后每次加载程序时,都必须排序.每次加载DLL时,都需要运行此算法.

在这里,
滚动到"按成员变量用"部分.我认为也可按类成员用.

我正在考虑更多链接器的中间步骤(一旦知道所有对象),或链接后步骤.不是运行时.
--DRT开关输出正确排序,然后另一个工具将其作为输入,然后可正确编辑可执行文件,或向编译器提供专门文件,输出预先组织的模块列表.它们可以是弱符号,然后只需在其他内容之前链接目标文件与该数据?或者,可告诉rt_init函数:“使用该指针数组作为列表,这样就不必排序”.

posted @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示