gpt4 book ai didi

c++ - 在类(class)特定版本的 placement new 中做什么?

转载 作者:行者123 更新时间:2023-11-30 04:40:26 25 4
gpt4 key购买 nike

即使您不能替换全局版本,也可以提供特定于类别的新版本。在哪些情况下类应提供自己的放置新运算符?

即使我的类没有实现 placement new,下面的代码也能工作(假设 abc 没有 operator new 被重载)。

char arr[100];

abc *pt = new(&arr)abc;

所以我解释说,有一些默认的 new 放置,但对于类,我们可以提供我们自己的 operator new 版本,我的问题是它的用例是什么?除了返回传递的相同指针之外,应该做什么?您是否遇到过任何有用的示例/场景?

最佳答案

听起来像是一道测验题...

更快更精简的分配
最常见的原因是需要动态分配的小对象很多。固定大小对象的自定义分配器的分配开销比通用分配器少得多,不会产生碎片,而且通常速度更快。 (此外,当这些分配从主堆中移除时,它们不再导致主堆碎片)。

类似地,非释放分配器(您可以分配多个对象,但不能一起释放它们,只能同时释放它们)是最快的分配方案,并且没有任何开销(除了一些罕见的对齐方式个案)。如果您正在构建一个您从不修改、仅作为一个整体删除的数据结构,这是有意义的。

其他基础分配器
另一个应用程序正在从与 C++ 堆不同的堆进行分配。也许对象中的数据需要在共享内存中分配以与其他进程交换,或者需要将其传递给获得所有权并需要使用特定分配器的系统函数。 (请注意,这也需要为所有子对象实现相同的机制,没有通用的方法来实现这一点)。

类似的(我使用它的地方)是当你在运行中创建代码时。如今,您需要告诉操作系统该内存页上的数据可以运行,但是您将获得相当大的内存块(例如 4K)。因此,再次向具有执行权限的操作系统请求一个页面 (4K),然后在其上分配许多小对象 - 使用 placement new。

关于c++ - 在类(class)特定版本的 placement new 中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1339068/

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