【问题标题】:Pimpl Idiom Memory UsagePimpl 成语内存使用情况
【发布时间】:2017-11-12 23:56:27
【问题描述】:

在我的新工作场所,代码大量使用了 Pimpl idiom,原因是为了减少编译时间。但我有一个基本查询 - pimpl 不需要动态分配内存吗?因此,实际上我们在堆中分配了比需要更多的内存。如果它被大量使用,你最终会使用更多的内存。 那么使用它是个好主意吗?

【问题讨论】:

  • 唯一额外的内存开销是实际的指针变量本身,它将是四个或八个字节(取决于您的目标是 32 位还是 64 位系统)。无论如何,结构的数据必须存储在某个地方。也许几个字节用于填充。一般来说,您无需担心,除非您开始遇到内存不足的情况(您可能应该先寻找其他地方)
  • @Someprogrammerdude - 使用标准全局分配器会产生记账的开销。成本/回报分析实际上取决于粉刺本身的大小。可能需要自定义小对象分配器。
  • @StoryTeller 没错,但在大多数情况下,我仍然认为这就像用大象枪射击苍蝇。
  • @Someprogrammerdude - 如果不进行分析,它确实是用火箭筒进行的过早优化。不过,如果考虑所有变量,这是一个有趣的问题,也是优化的场所。
  • 如果您不分配数百万个这些对象,我不会担心

标签: c++ memory heap-memory dynamic-memory-allocation pimpl-idiom


【解决方案1】:

...原因是为了减少编译时间。

您的意思是说我猜的重新编译时间,正如Is the pImpl idiom really used in practice? 中所建议的那样(“重新编译时间确实减少了,因为只需要重新构建源文件,而不是头文件,以及包含它的每个文件”) .

pimpl 不需要动态分配内存吗?

不是真的,它需要指针,但指针可以设置为指向任何东西,不管它是否是静态的。在Pimpl idiom without using dynamic memory allocation阅读更多内容。

如果它被大量使用,你最终会使用更多的内存。

嗯,开销是由于指针(4 或 8 个字节)。无论如何,数据都必须存储在某个地方,无论这个“某个地方”是否是静态的,内存几乎都是一样的。

我说的差不多了,因为如果内存是动态分配的,系统必须做一些内务处理,这会产生开销。

但是,由于您使用了 Pimpl Idiom,因此内存不足的可能性极小。如果你这样做了,那么问题就在其他地方,如果没有那个习语,你也会失去记忆。


PS:正如 juanchopanza 所说,Memory Fragmentation(“当您的大部分内存分配在大量不连续的块或块中时 - 留下很大比例的总内存未分配,但在大多数典型情况下不可用") 也应考虑在内

【讨论】:

  • 还有内存碎片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2012-05-30
  • 2021-02-26
  • 2010-10-24
  • 2015-06-14
相关资源
最近更新 更多