• d栈上的类


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

    void main() @nogc
    {
        scope o = new Object();
    }
    
    • 1
    • 2
    • 3
    • 4

    @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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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);//栈上
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

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

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

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

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

  • 相关阅读:
    TypeScript(4)接口
    MATLAB环境下使用相关图可视化相关矩阵
    Anaconda Powershell Prompt和Anaconda Prompt的区别
    PHP跨域解决
    DGIOT 智慧车间机床设备数据采集
    这份阿里强推的并发编程知识点笔记,将是你拿大厂offer的突破口
    基于Android的O2O点餐系统
    [yolo系列:YOLOV7改进-添加CoordConv,SAConv.]
    表单 v-decorator 相关用法
    向毕业妥协系列之机器学习笔记:神经网络(四)Tensorflow实现(中)多分类问题
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/126720574