C++ 高效使用 new 运算符

标签 c++ memory

当用 new 实例化一个类时。基于对象的重用,我们将获得什么样的好处而不是删除内存?

new的流程是什么?是否发生上下文切换?分配了新内存,谁在分配?操作系统?

最佳答案

你在这里问了几个问题......

Instead of deleting the memory what kinds of benefits would we gain based on the reuse of the objects?

这完全取决于您的应用程序。即使假设我知道该应用程序是什么,您还没有说明另一个细节——重用背后的策略是什么?但即使知道这一点,也很难做出笼统的预测或回答。尝试一些事情并测量它们。

根据经验,我喜欢尽量减少最无偿的分配。不过,这主要是过早的优化。它只会对数千个电话产生影响。

What is the process of new?

完全依赖于实现。但是分配器使用的一般策略是有一个空闲列表,即在进程中已被释放的 block 列表。当空闲列表为空或包含的连续空闲空间不足时,它必须向内核请求内存,它只能以恒定页面大小的 block 的形式提供。 (x86 上为 4096。)分配器还必须决定何时分割、填充或合并 block 。多线程也会给分配器带来压力,因为它们必须同步它们的空闲列表。

通常这是一个相当昂贵的操作。也许与你正在做的其他事情没有太大关系。但它并不便宜。

Does a context switch occur?
完全有可能。也有可能不会。您的操作系统在收到中断或系统调用时可以随时进行上下文切换,所以呃......这可能会发生很多次;我看不出这与您的分配器之间有任何特殊关系。

New memory is allocated, who is doing the allocation? OS ?
它可能来自空闲列表,在这种情况下不涉及系统调用,因此操作系统没有帮助。但如果空闲列表不能满足请求,它可能来自操作系统。此外,即使它来自空闲列表,您的内核也可能已将该数据调出页面,因此您可能会在访问时遇到页面错误,并且内核的分配器会启动。所以我想这是一个混合包。当然,您可以有一个符合规范的实现来做各种疯狂的事情。

关于C++ 高效使用 new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613077/

相关文章:

c++ - 插入 std::map 时检测到 glibc(内存错误)

Java程序运行一段时间后变慢

c++ - 我的cout怎么了?

c++ - 无法取消引用插入到 vector 中的类对象指针

.net - 在 Application.Exit 调用之前,Object = Nothing 是否有意义?

c++ - 使用 new 分配 4k 整数后内存覆盖

c++ - "New"运算符的不同行为 - 动态内存分配

c++ - 多态指针的typeid?

c++ - 从 Maven 访问自定义(非 Java) Artifact 存储库

c++ - 参数和成员变量同名不好吗?