数组变量共享多少信息?

发布于 2024-12-25 21:06:32 字数 646 浏览 2 评论 0原文

当我将一个数组变量分配给另一个数组变量时,会复制/共享多少信息?

int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
int[] b = a;
a[0] = 42;
writefln("%s %s", a[0], b[0]);   // 42 42

显然,ab 共享相同的负载,因为 42 被打印了两次。

a ~= 10;
writefln("%s %s", a.length, b.length);   // 11 10

附加到a不会改变b,所以长度似乎不是有效负载的一部分?

b = a;
a ~= 11;
b ~= 42;
writefln("%s %s", a[11], b[11]);   // 11 42

符合标准的 D 实现也可以打印 42 42 吗? b ~= 42 可以覆盖 a 中的 11 吗?

ab 到底什么时候彼此分离? D 是否在后台执行一些 COW?

How much information is copied/shared when I assign one array variable to another array variable?

int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
int[] b = a;
a[0] = 42;
writefln("%s %s", a[0], b[0]);   // 42 42

Apparently, a and b share the same payload, because 42 is printed twice.

a ~= 10;
writefln("%s %s", a.length, b.length);   // 11 10

Appending to a does not change b, so the length does not seem to part of the payload?

b = a;
a ~= 11;
b ~= 42;
writefln("%s %s", a[11], b[11]);   // 11 42

Could a conforming D implementation also print 42 42? Could b ~= 42 overwrite the 11 inside a?

When exactly are a and b detached from each other? Is D performing some COW in the background?

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

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

发布评论

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

评论(2

感性不性感 2025-01-01 21:06:33

D 中的“数组”实际上并不存在。

切片可以。

切片只是一个指针和一个长度。因此,当您将它们相互分配时,指针和长度都会被复制。如果您修改目标数据,那么它将在切片的所有实例中可见 - 但如果您放大一个切片,另一切片仍将使用其旧长度。

通常,您无法“缩小”内存中数组的实际长度(尽管您当然可以减少切片的长度,因此它“看到”的数据更少),因此这不会导致问题。

希望这能解释发生了什么。

"Arrays" in D don't really exist.

Slices do.

Slices are just a pointer and a length. So when you assign them to each other, the pointer and the length get copied. If you modify the target data, then it'll be visible in all instances of the slices -- but if you enlarge one slice, the other one will still be using its old length.

You normally can't "shrink" the actual length of the array in memory (although you can certainly reduce the slice's length, so it 'sees' less data), so that doesn't cause issues.

Hope that explains what's going on.

感性 2025-01-01 21:06:33

D 中的数组变量相当于

struct array!T{
    size_t length;
    T* ptr;

}

(加上索引和切片的实现

)追加的特殊之处在于它可以保留原始切片并追加到末尾。仅当数组的容量足够大时才会发生这种情况或者 realloc 可以就地扩展

这些最后的东西在 GC 中维护

array variables in D are equivalent to

struct array!T{
    size_t length;
    T* ptr;

}

(plus the implementations for indexing and slicing)

the appending is special in that it may keep the original slice and append to the end. This happens only when either the capacity of the array is large enough or the realloc can expand inplace

these last things are maintained in the GC

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