3

我正在制作一个简单的字节缓冲区,它将其数据存储在使用 new 获取的 char 数组中,我只是想知道如果 memcpy 和 memmove 函数用于使用 new 获取的内存是否会给我带来任何奇怪的东西,或者有什么你会推荐做的?

4

5 回答 5

4

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

于 2010-03-10T19:55:24.610 回答
3

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

于 2010-03-10T19:58:04.570 回答
2

对于 char 数组数据,即使与 new 结合使用也应该可以正常工作。

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

于 2010-03-10T20:03:17.553 回答
1

这实际上取决于您的平台,以及您的编译器对newand的实现memmove。大多数处理器架构在字边界对齐时可以更好地对数据进行混洗,但有些处理器架构在其他情况下表现更好。例如,PowerPC 7447 在内存按16 字节边界对齐的情况下运行速度最快。这是其 Altivec SIMD 指令集的向量寄存器的大小,因此 memcpy 或类似功能可以在分配在 16 字节边界上的数组上实现得更快。有关示例,请参见此问题。

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

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

于 2010-03-10T20:17:46.957 回答
0

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

于 2010-03-10T20:16:03.273 回答