Dlang gem撰写有关@nogc
的文章。仅供参考,我还没有看到为什么'@nogc'应该存在而且这个代码在@nogc
心态中是不可取的:
void foo() {
auto a = new A;
}
正如宝石所说,当人们尝试使用@nogc
时会导致错误:
void foo() @nogc {
// ERROR:
auto a = new A;
}
所以我的问题:
您能否举例说明为什么这种方法不好,以及@nogc
兼容的等效版本?
一个更现实的例子。我正在尝试将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.");
}
}
答案 0 :(得分:2)
垃圾收集可能是游戏等实时应用程序中的一个性能问题,它可能表现为周期性的“口吃”。每当收集发生时。
您可以采用一些方法来编写@nogc
代码:
@nogc
会很痛苦。struct
代替class
,静态数组而不是动态数组,等等。malloc
和free
管理您自己的记忆,就像在C中一样,而不是使用new
,就像在#34;典型" D代码。这很可能导致代码更复杂且容易出错,但如果您从C移植代码则可能是合适的。std.experimental.allocator
管理自己的记忆。请注意,它是experimental
。没有GC的编程可能会更困难,而且通常不是必需的,但是您可以开发一些习惯,避免虚假分配,而不会使代码复杂化。 Walter Bright给出good presentation关于如何使用基于范围的思维模式进行编程可以避免分配的需要。