D个不推荐使用的类分配器

D个不推荐使用的类分配器,d,D,为什么D2中不推荐类分配器和DealLocator 还有一个小问题,D中的引用是如何实现的 我在某处看到了关键字ref,但我不知道,引用是如何实现的 你有没有想过全局句柄表和引用只是索引 不推荐使用类分配器和DealLocator,因为使用它们,用户并不真正知道发生了什么,从而导致内存安全或泄漏问题。通常,D程序假定new X与垃圾收集器一起工作,而当分配器被更改时,它可能不会工作,从而导致混乱 相反,如果您想更改分配,您应该提供一个工厂函数,这样就可以清楚地看出这是以不同的方式完成的。与私有构

为什么D2中不推荐类分配器和DealLocator

还有一个小问题,D中的引用是如何实现的

我在某处看到了关键字ref,但我不知道,引用是如何实现的


你有没有想过全局句柄表和引用只是索引

不推荐使用类分配器和DealLocator,因为使用它们,用户并不真正知道发生了什么,从而导致内存安全或泄漏问题。通常,D程序假定
new X
与垃圾收集器一起工作,而当分配器被更改时,它可能不会工作,从而导致混乱

相反,如果您想更改分配,您应该提供一个工厂函数,这样就可以清楚地看出这是以不同的方式完成的。与私有构造函数一起,您可以强制使用自定义函数


引用被实现为指针。当您在D中写入
void foo(ref int b){b=10;}
时,就好像您在C中写入
void foo(int*b){*b=10;}
一样。指针是表示为数字的内存地址。它指向对象的位置,并允许通过它更改对象。复制指针和复制常规整数一样便宜,因此将它们传递给函数是非常有效的。

类分配器和DealLocator不受欢迎,因为使用它们,用户不知道发生了什么,从而导致内存安全或泄漏问题。通常,D程序假定
new X
与垃圾收集器一起工作,而当分配器被更改时,它可能不会工作,从而导致混乱

相反,如果您想更改分配,您应该提供一个工厂函数,这样就可以清楚地看出这是以不同的方式完成的。与私有构造函数一起,您可以强制使用自定义函数


引用被实现为指针。当您在D中写入
void foo(ref int b){b=10;}
时,就好像您在C中写入
void foo(int*b){*b=10;}
一样。指针是表示为数字的内存地址。它指向对象的位置,并允许通过它更改对象。复制指针和复制常规整数一样便宜,因此将它们传递给函数是非常有效的。

这很令人伤心。在C++中,程序员知道它是如何工作的,而不是D。它将在将来被删除(类分配器和解除分配器)?比如scope关键字?我如何制作工厂函数(它是一个简单的函数?)?如何调用address上的构造函数?scope关键字不会消失,现在只有一个非常特别的用法不推荐使用-在类声明中使用它将其放在堆栈上。不推荐使用它,因为转义该引用将导致内存损坏。但是,作用域也应该禁止转义引用,所以如果我们真的实现了它,堆栈优化就会回来。顺便说一句,scope的其他用法,例如
scope(exit)
,都没有用。对于factory函数,只需执行一个常规函数或静态方法,以任意方式分配内存,然后使用emplace构造类:下面是一个简单的示例:注意,我没有将ctor设置为私有,因为这实际上破坏了emplace。如果你想要一个私有构造函数,你也必须自己放置而不是使用库函数;那太可悲了。在C++中,程序员知道它是如何工作的,而不是D。它将在将来被删除(类分配器和解除分配器)?比如scope关键字?我如何制作工厂函数(它是一个简单的函数?)?如何调用address上的构造函数?scope关键字不会消失,现在只有一个非常特别的用法不推荐使用-在类声明中使用它将其放在堆栈上。不推荐使用它,因为转义该引用将导致内存损坏。但是,作用域也应该禁止转义引用,所以如果我们真的实现了它,堆栈优化就会回来。顺便说一句,scope的其他用法,例如
scope(exit)
,都没有用。对于factory函数,只需执行一个常规函数或静态方法,以任意方式分配内存,然后使用emplace构造类:下面是一个简单的示例:注意,我没有将ctor设置为私有,因为这实际上破坏了emplace。如果你想要一个私有构造函数,你也必须自己放置而不是使用库函数;