在我的新工作场所,代码大量使用Pimpl习语,原因是缩短编译时间。但我有一个基本的查询 - pimpl不需要动态分配内存吗?所以,实际上我们在堆中分配的内存比需要的多。如果它被大量使用,你最终会使用更多的内存。 那么使用它是个好主意吗?
答案 0 :(得分:2)
......原因是缩短编译时间。
你的意思是说重新编译的时间我想,正如Is the pImpl idiom really used in practice?中所建议的那样(“重新编译时间确实减少了,因为只需要重建源文件,而不是标题,以及包含它的每个文件“)。
pimpl不需要动态分配内存吗?
不是真的,它需要指针,但指针可以设置为指向任何东西,无论这是否是静态的。阅读Pimpl idiom without using dynamic memory allocation中的更多内容。
如果它被大量使用,你最终会使用更多内存。
好吧,开销是由指针(4或8字节)引起的。在任何情况下,数据都必须存储在某处,无论这个“某处”是否是静态的,内存都是相同的。
我说了很多,因为如果内存是动态分配的,系统必须做一些内务处理,这会导致开销。
然而,由于你使用了Pimpl Idiom,因此极不可能耗尽内存。如果你这样做,那么问题出在其他地方,如果没有那个成语,你就会失去记忆。
PS:正如juanchopanza所说,Memory Fragmentation(“当你的大部分内存分配在大量不连续的块或块中时 - 留下很大比例的总内存未分配,但大多数都无法使用也应该考虑典型情景“)