gpt4 book ai didi

object - 对象是否在 D 中被间接访问?

转载 作者:行者123 更新时间:2023-12-05 01:04:51 25 4
gpt4 key购买 nike

正如我读过的,D 中的所有对象都与位置完全无关。这个要求是如何实现的?

我想到的一件事是,所有引用都不是指向对象的指针,而是指向某个代理,因此当您移动对象(在内存中)时,您只需更新该代理,而不是程序中使用的所有引用。

但这只是我的猜测。它是如何在 D 中实现的?

最佳答案

编辑:前面的底线,没有代理对象,对象直接通过常规指针引用。/编辑

结构不允许保留指向自己的指针,因此如果它们被复制,它们应该继续正常工作。不过,这并不是由语言严格执行的:

struct S {
S* lol;
void beBad() {
lol = &this; // this compiler will allow this....
}
}

S pain() {
S s;
s.beBad();
return s;
}

void main() {
S s;
s = pain();
assert(s.lol !is &s); // but it will also move the object without notice!
}

(编辑:实际上,我猜你可以使用 postblit 来更新内部指针,所以它并不是没有通知。如果你足够小心,你可以让它工作,但话说回来,如果你足够小心,你也可以在脚趾之间射击而不会碰到你的脚。编辑2:实际上不,编译器/运行时仍然允许在不调用 postblit 的情况下移动它。发生这种情况的一个例子是,如果它将堆栈帧复制到堆中关闭。结构数据被移动到一个新地址而不被通知。所以是的。/编辑)

实际上,该断言并不能保证通过,编译器可能会选择调用 pain直接在 main 中声明的本地对象上,所以指针会起作用(尽管我无法在演示中强制执行此优化,通常,当您从函数返回结构时,它实际上是通过调用者传递的隐藏指针完成的 - 调用者说“放置返回值就在这里”,从而在某些情况下避免复制/移动)。

但无论如何,重点只是编译器可以随意复制或不复制结构体,因此如果您确实将 this 的地址保留在其中,它可能会在没有通知的情况下无效;保留该指针不是编译错误,而是未定义的行为。

不同的类情况就不同了。允许类保留对 this 的引用在内部,因为类是(理论上,由垃圾收集器实现实现))具有无限生命周期的独立对象。虽然它可能会被移动(例如是一个移动的 GC(今天在 D 中没有实现)),如果它被移动,所有对它的引用,内部和外部,也将需要更新。

所以类不能像结构那样从它们下面取出内存(除非你程序员自己动手并绕过GC......)

我很确定与位置无关的事情仅指结构,并且仅指它们不能具有指向自身的指针的规则。引用或指针没有魔法——它们确实可以处理内存地址,没有代理对象。

关于object - 对象是否在 D 中被间接访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com