C++ memmove、memcpy和new

C++ memmove、memcpy和new,c++,memory,new-operator,memcpy,C++,Memory,New Operator,Memcpy,我正在制作一个简单的字节缓冲区,将其数据存储在使用new获取的char数组中,我只是想知道如果在使用new获取的内存中使用memcpy和memmove函数,是否会给我带来任何奇怪的东西,或者您建议改为使用memcpy()/memmove()应该可以很好地处理此类数据。一般来说,您可以在任何吊舱类型上安全地使用它们。不,它们非常好new和malloc()只是在堆上获取内存的两种不同方式(实际上它们是完全相同的,因为new在大多数实现中使用malloc())。只要您手中有一个有效的char*变量(由

我正在制作一个简单的字节缓冲区,将其数据存储在使用new获取的char数组中,我只是想知道如果在使用new获取的内存中使用memcpy和memmove函数,是否会给我带来任何奇怪的东西,或者您建议改为使用
memcpy()
/
memmove()
应该可以很好地处理此类数据。一般来说,您可以在任何吊舱类型上安全地使用它们。

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

对于char数组数据,即使与new一起使用,它也应该可以正常工作


<>但是在C++中为什么不使用STD::复制或STD::CopyOff-Dead,完全消除问题?

< P>我仍然使用带有STD::复制的向量,但这并不意味着NeM/MeMyP/MeMePad是坏的。如果您坚持在缓冲区内移动部件,则实际上最好使用memmove。

这实际上取决于您的平台,以及编译器对
new
memmove
的实现。大多数处理器架构在字边界上对齐时可以更好地洗牌数据,但有些处理器架构在其他情况下性能更好。例如,PowerPC7447在内存对齐的情况下工作最快。这是其Altivec SIMD指令集的向量寄存器的大小,因此在分配16字节边界的阵列上,memcpy或类似函数可以实现得更快。有关示例,请参见


为什么这会对新产品产生影响?因为新操作符可以在返回指针之前的两个字节中存储有关分配内存块的一些元数据,所以它给您的实际指针比分配的实际开始位置晚一两个字。在我遇到这种行为的CPU、操作系统和编译器(PowerPC 7447a、VxWorks 5.5、GCC 2.95)上,新操作符保证为您提供8字节对齐但不是16字节对齐的块。当然,这是非常具体的实现。我不相信C++标准中有任何指定对齐的东西,因为这将是一个架构特定的优化。
所有这些的要点是,如果您在某个平台上,并且关心诸如对齐之类的低级优化问题,那么它可能会产生轻微的性能差异。对于大多数应用程序,您可能不必担心这一点。

memcpy等人没有错,但为什么不简单地使用std::string?我宁愿跳过std::string.c_str()的整个中间部分,因为它将被传递到send()和recv()。然后std:;向量可能就是你想要的。中间人是你的朋友。你有一个很好的观点,但我不打算在分配缓冲区后调整缓冲区大小,所以我不希望与调整缓冲区大小相关的开销。“新操作符可以在返回指针之前的两个字节中存储有关分配内存块的一些元数据,因此它提供给您的实际指针比分配的实际开始位置晚一两个字”-就像malloc()一样,然后。是的。就像malloc一样。一些平台提供了另一种内存分配函数,允许您指定内存的对齐边界。如果您真的关心对齐,您应该寻找这些例程中的一个。应该注意,您必须有一个有效的
char*
变量。
char*c=NULL;
char*c=0xfacefeed;
可能无法很好地与
memcpy()
memmove()
配合使用。编辑以澄清此情况。谢谢!