2017-01-02 96 views
0

首先,我知道我错了,但我不知道我的错误是什么。 据this link,关于“realloc的”它说,C++ realloc性能vs malloc

的内存块的内容被保留到新老大小的较少,即使块移动到新的位置。如果新尺寸较大,则新分配的部分的值不确定。

因此,如果我们使用“realloc”如果它想分配新的位置数据,它会复制以前的数据到新的位置。所以如果这是真的,我很好奇知道是不是更好地使用free + malloc而不是realloc?因为我认为当我们考虑性能时,将以前的数据复制到新位置并不是一个好主意。

任何人都可以帮助我找出我的错误在哪里吗? 在此先感谢。

+2

我认为realloc会选择一个新的位置并复制到它很罕见,但假设一个新的位置永远不会被选择可能会导致UB。最好只使用realloc并忽略最小和罕见的性能后果。 – George

+0

使用'realloc'的主要目的是使用已分配缓冲区中的数据,因为它具有一些额外的空间。如果你不需要现有的数据,那么你可以做'free + malloc'。手动复制在性能方面会更差,因为libc非常优化,如果有足够多的连续空间满足新的分配要求,甚至可能不需要复制。 – sardok

+2

为什么标记为C++?你不应该在C++中使用malloc/realloc来开始。 – Lundin

回答

4

使用realloc - 它有一个堆的结构更好的想法,因此将尽量避免做副本。

在做的malloc /复印/免费每次不具备此性能增强

+0

你为什么说“malloc/copy/free”,因为我不再需要以前的数据,所以它会是“malloc/free”。 你的意思是说,在“realloc”需要复制数据的情况下,“malloc/free”会是更好的方法吗? – pooyan

+1

@pooyan如果你不需要旧数据,你为什么要考虑'realloc'? (而在C++中,无论如何,您都应该远离'malloc'和'realloc'。) – molbdnilo

+0

考虑我有一个循环,并且在每次迭代中,我需要分配新位置以获取新数据。 – pooyan

3

realloc的理由是,它比“第二的malloc,手动复制,自由”的速度更快。正如你怀疑的那样,正常的freemalloc会更快,但那是因为他们少了。

PS。在C++中,realloc是非常危险的,因为它无法调用复制构造函数。 OTOH,std::vector::resize会调用复制构造函数,默认构造函数和/或析构函数。

+1

我不知道“失败”是一个公平的描述,它选择不/甚至不尝试。你不能失败的时候,这种行为从来没有你的意图首先;) –

+0

坦克为您的答案。所以你的意思是如果我不需要以前的数据,“malloc”+“free”会更好一些吗?我对吗? – pooyan

+0

@pooyan:非常非常。另一个答案是错误的。 – MSalters