【问题标题】:Allocation and fragmentation on the heap堆上的分配和碎片
【发布时间】:2018-02-12 00:38:06
【问题描述】:

我需要在堆上分配一个复杂的结构。它由一些基本类型和自定义对象组成。这些自定义对象由一些基本类型和一些其他自定义对象组成。这些自定义对象由一些基本类型和一些其他自定义对象组成,等等……

我一直在做的方式是将基本类型存储为自动变量,同时制作自定义对象(智能)指针。

但是,由于主对象是作为(智能)指针创建的,所以所有这些都是在堆上分配的,不是吗?但是每次我使用另一个(智能)指针时,它都会进行另一次分配和内存碎片,对吧?

所以我不应该真的使用指针,除了将最初的指针放在堆上,不是吗?所有具有可变大小的对象都将可变部分存储在地图或矢量中,它们自己分配东西,但在这一点上,无论如何这是必要的,因为我不知道有多少,如果有的话,会有的。

无论如何,我这样想是对的吗? 指针用的越少越好吗?

【问题讨论】:

  • 请显示一些代码,不要说MCVE。
  • 另外,我不会过早优化。如果您认为这可能是一个问题,请构建一个实验来确定它是否是一个问题。
  • 如果发现碎片确实是个问题,你可以随时使用slab分配器或类似的方法来处理它。但很可能它不会成为问题,因此,暂时不用担心它,您可能会避免做大量不必要的工作并为您的程序增加大量不必要的复杂性。跨度>
  • 分配内存不会使堆碎片化。有时会释放内存,但如果你释放了一堆同时分配的东西,释放的内存几乎肯定会被合并,所以碎片很少。
  • 您是否在为您的对象使用 C++ stl 容器?

标签: c++ pointers memory-management heap-memory


【解决方案1】:

从设计的角度来看,使用任何更有意义的东西。

如果结果变慢(可能不会,无论如何),分析和优化瓶颈。

【讨论】:

  • 我有一个大型结构,需要能够读取和更改。他最大的一点是结构将倾向于被修改,它的一部分(stl容器)将添加和删除成员。鉴于这一切,使用指向已经在堆上的结构中的对象的指针有什么意义,或者只是将它们分配为包含它们的对象的一部分?
猜你喜欢
  • 2014-01-23
  • 2014-07-14
  • 2012-04-03
  • 2012-04-28
  • 2011-12-22
  • 2011-12-09
  • 2012-01-11
  • 2010-10-15
  • 2012-03-01
相关资源
最近更新 更多