@nogc不兼容的一些例子是不可取的?

时间:2017-04-18 09:24:09

标签: d

Dlang gem撰写有关@nogc的文章。仅供参考,我还没有看到为什么'@nogc'应该存在而且这个代码在@nogc心态中是不可取的:

void foo() {
    auto a = new A;
}

正如宝石所说,当人们尝试使用@nogc时会导致错误:

void foo() @nogc {
  // ERROR:
    auto a = new A;
}

所以我的问题: 您能否举例说明为什么这种方法不好,以及@nogc兼容的等效版本?

更新20170418:

一个更现实的例子。我正在尝试将rather light-weight C header文件移植到高质量的D版本(可读性/可维护性,可用性和性能的良好平衡)。我在here上发布了一个相关问题。可以看出,这个结构不允许@nogc属性,因为它new分配内存。观看@rcorre建议的Walter Bright讲话给人留下了强烈的印象,我应该选择range。但我还不知道如何实现这一点。我还想澄清一下,这种探索高质量D代码的尝试并不是一种“早期优化”的思维模式。我想尽早养成良好的习惯,这样我就可以避免在以后的时间点解决很多问题。

struct Kstream(T) {
    ubyte[] buf;
    int begin, end, is_eof;
    T f;

    this(T f, ubyte bs)
    {
        this.f = f;
        this.buf = new ubyte[bs];
    }

    ~this()
    {
      writeln("Destroyed struct.");
    }
}

1 个答案:

答案 0 :(得分:2)

垃圾收集可能是游戏等实时应用程序中的一个性能问题,它可能表现为周期性的“口吃”。每当收集发生时。

您可以采用一些方法来编写@nogc代码:

  1. 唐'吨。除非您知道需要进行优化,否则@nogc会很痛苦。
  2. 完全避免分配。使用struct代替class,静态数组而不是动态数组,等等。
  3. 使用mallocfree管理您自己的记忆,就像在C中一样,而不是使用new,就像在#34;典型" D代码。这很可能导致代码更复杂且容易出错,但如果您从C移植代码则可能是合适的。
  4. 使用std.experimental.allocator管理自己的记忆。请注意,它是experimental
  5. 没有GC的编程可能会更困难,而且通常不是必需的,但是您可以开发一些习惯,避免虚假分配,而不会使代码复杂化。 Walter Bright给出good presentation关于如何使用基于范围的思维模式进行编程可以避免分配的需要。