我想在内存块中写一个重复的字节模式.我的想法是编写模式的第一个示例,然后将其复制到缓冲区的其余部分.例如,如果我从这开始:
ptr: 123400000000
Run Code Online (Sandbox Code Playgroud)
之后,我希望它看起来像这样:
ptr: 123412341234
Run Code Online (Sandbox Code Playgroud)
我以为我可以memcpy用来写相交区域,像这样:
memcpy(ptr + 4, ptr, 8);
Run Code Online (Sandbox Code Playgroud)
该标准没有指定副本将发生的顺序,因此如果某些实现使其以相反的顺序复制,则它可以给出不同的结果:
ptr: 123412340000
Run Code Online (Sandbox Code Playgroud)
甚至合并结果.
有没有让我仍然使用的解决方法memcpy,或者我是否必须实现自己的for循环?请注意,我无法使用,memmove因为它正是我正在努力避免的; 它让ptr成为123412340000我想要的123412341234.
我为Mac/iPhone(clang编译器)编程,但一般的答案也会很好.
这是kernel.org所说的:
memcpy()函数将n个字节从内存区域src复制到内存区域dest.内存区域不得重叠.如果内存区域重叠,请使用memmove(3).
这是MSDN所说的:
如果源和目标重叠,则memcpy的行为未定义.使用memmove处理重叠区域.
在存储器范围上重复字节模式没有标准功能.您可以使用memset_pattern*函数系列来获得固定大小的模式; 如果你需要改变大小,你必须自己动手.
// fills the 12 first bytes at `ptr` with the 4 first bytes of `ptr`
memset_pattern4(ptr, ptr, 12);
Run Code Online (Sandbox Code Playgroud)
请注意memset_pattern4,memset_pattern8并且memset_pattern16仅存在于Mac OS/iOS上,因此不要将它们用于跨平台开发.
否则,滚动执行每字节字节复制的(跨平台)函数非常容易.
void byte_copy(void* into, void* from, size_t size)
{
for (size_t i = 0; i < size; i++)
into[i] = from[i];
}
Run Code Online (Sandbox Code Playgroud)