memmove,memcpy和new

时间:2010-03-10 19:51:34

标签: c++ memory new-operator memcpy

我正在创建一个简单的字节缓冲区,将其数据存储在使用new获取的char数组中,我只是想知道如果在使用new获取的内存上使用memcpy和memmove函数是否会给我任何奇怪的东西,或者你有什么想法建议改为做什么?

5 个答案:

答案 0 :(得分:4)

使用memcpy() / memmove()应该可以正常使用这类数据。通常,您可以在任何POD类型上安全地使用它们。

答案 1 :(得分:3)

不,他们完全没问题。 newmalloc()只是两种不同的方式可以在堆上获取内存(实际上它们完全相同,因为new在大多数实现中都使用malloc() )。只要您手中有一个有效的char*变量(由newmalloc()或堆栈分配),它就只是指向内存的指针,因此memcpy()和该系列的其他功能将按预期工作。

答案 2 :(得分:2)

对于char数组数据,它甚至可以与new结合使用。

但是在C ++中为什么不使用std :: copy或std :: copy_backward并完全消除这个问题?

答案 3 :(得分:1)

这实际上取决于您的平台,以及编译器对newmemmove的实现。大多数处理器体系结构在字边界上对齐时会更好地改组数据,但有些处理器体系结构具有更好的性能。例如,PowerPC 7447在16 byte boundaries上对齐内存时运行速度最快。这是Altivec SIMD指令集的向量寄存器的大小,因此可以在16字节边界上分配的数组上实现memcpy或类似的功能。有关示例,请参阅this question

为什么这会对新产品产生影响?因为new运算符可以在它返回的指针之前的几个字节中存储一些关于分配的内存块的元数据,所以它给你的实际指针是超过实际分配开始的一两个字。在我遇到此行为的CPU,OS和编译器(PowerPC 7447a,VxWorks 5.5,GCC 2.95)上,新运算符保证为您提供8字节对齐但未对齐16字节的块。当然,这是非常具体的实现。我不相信C ++标准中有任何指定对齐的东西,因为这将是一个特定于架构的优化。

所有这一切的重点在于,如果您在某个平台上并且关心对齐等低级优化问题,它可能会产生轻微的性能差异。对于大多数应用程序,您可能不需要担心这一点。

答案 4 :(得分:0)

我仍然会使用带有std :: copy的vector,但这并不意味着new / memcpy / memmove是坏的。如果你坚持在缓冲区内移动部件,那么memmove实际上是首选。