如何在不进行 GC 分配的情况下初始化 D 中的静态数组?

发布于 2024-11-25 05:50:00 字数 312 浏览 4 评论 0原文

在 D 中,所有数组文字都是动态数组,因此由 GC 分配。

即使在这个简单的示例中:

int[3] a = [10, 20, 30];

数组也是在堆上分配的,然后复制到 a 中。

您应该如何在没有堆分配的情况下初始化静态数组?

您可以手动完成:

int[3] a = void;
a[0] = 10;
a[1] = 20;
a[2] = 30;

但这充其量是乏味的。

有更好的办法吗?

In D, all array literals are dynamic arrays, and are therefore allocated by the GC.

Even in this simple example:

int[3] a = [10, 20, 30];

The array is heap-allocated and then copied into a.

How are you supposed to initialise a static array without heap-allocation?

You could do it manually:

int[3] a = void;
a[0] = 10;
a[1] = 20;
a[2] = 30;

But this is tedious at best.

Is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

等风也等你 2024-12-02 05:50:00
static const int[3] a = [10, 20, 30];

这将在数​​据段中放置一个常量副本。您可以通过简单的赋值 (auto copy = a;) 在堆栈上创建一个副本(不涉及堆分配)。

static const int[3] a = [10, 20, 30];

This will place a constant copy in the data segment. You can create a copy on the stack (that doesn't involve a heap allocation) with a simple assignment (auto copy = a;).

苯莒 2024-12-02 05:50:00

我认为如果您可以将文字全局声明为不可变的,然后使用它作为初始化器,则没有堆分配 - 但我可能是错的,我不确定。

I think if you could declare the literal as immutable globally, then use that as the initializer, there's no heap allocation -- but I may be wrong, I'm not sure.

余罪 2024-12-02 05:50:00

我认为您可能有点错误:在 http://www .digitalmars.com/d/2.0/arrays.html#static-init-static

静态数组的静态初始化

静态初始化由数组元素值列表提供
括在 [ ] 中。这些值前面可以有一个索引(可选)
一个:。如果未提供索引,则将其设置为前一个索引加上
1,如果是第一个值,则为 0。

-剪断-

这些数组出现在全局范围内时是静态的。否则,需要用 const 或 static 存储类标记它们,使它们成为静态数组。

代码示例

int[3] a = [ 1:2, 3 ]; // a[0] = 0, a[1] = 2, a[2] = 3

意味着 const a[3] = [10, 20, 30]; 不会/不应该在堆上分配任何内容

I think you might be a bit mistaken: in http://www.digitalmars.com/d/2.0/arrays.html#static-init-static

Static Initialization of Static Arrays

Static initalizations are supplied by a list of array element values
enclosed in [ ]. The values can be optionally preceded by an index and
a :. If an index is not supplied, it is set to the previous index plus
1, or 0 if it is the first value.

-snip-

These arrays are static when they appear in global scope. Otherwise, they need to be marked with const or static storage classes to make them static arrays.

with code example

int[3] a = [ 1:2, 3 ]; // a[0] = 0, a[1] = 2, a[2] = 3

that means that const a[3] = [10, 20, 30]; won't/shouldn't allocate anything on the heap

暖心男生 2024-12-02 05:50:00

这只是一个编译器错误。我在 DMD 的 bugzilla 中看到了它。现在应该已修复(DMD 2.055)。

It's just a compiler bug. I saw it in DMD's bugzilla. It should be fixed by now (DMD 2.055).

深海少女心 2024-12-02 05:50:00

2017 更新:在 DMD 的任何最新版本中,在静态数组上使用数组初始值设定项不再分配,即使静态数组是局部变量(即堆栈分配)。

您可以通过创建一个初始化静态数组的函数来亲自验证这一点,然后将该函数标记为 @nogc 并观察它是否可以编译。示例:

import std.random;
import std.stdio;
int[4] testfunc(int num) @nogc
{
    return [0, 1, num, 3];
}

int main()
{
    int[4] arr = testfunc(uniform(0, 15));
    writeln(arr);
    return 0;
}

由于 testfunc() 尽管是 @nogc 仍然可以编译,所以我们知道数组初始值设定项不会分配。

2017 UPDATE: In any recent version of DMD, using an array initializer on a static array no longer allocates, even if the static array is a local variable (ie stack-allocated).

You can verify this yourself by creating a function where a static array is initialized, and then marking the function as @nogc and observing whether or not it compiles. Example:

import std.random;
import std.stdio;
int[4] testfunc(int num) @nogc
{
    return [0, 1, num, 3];
}

int main()
{
    int[4] arr = testfunc(uniform(0, 15));
    writeln(arr);
    return 0;
}

Since testfunc() compiles despite being @nogc, we know that the array initializer does not allocate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文