内存函数以字节为单位更改
1.memcpy
memcpy
是 C/C++ 中的一个标准库函数,用于内存拷贝操作。它的原型通常定义在 <cstring>
头文件中,其作用是将一块内存中的数据复制到另一块内存中。
函数原型:void *memcpy(void *dest, const void *src, size_t n);
在 C++ 中,memcpy
函数也可以直接使用,但推荐使用类型安全的 std::memcpy
,原型也在 <cstring>
头文件中声明:void* memcpy(void* dest, const void* src, size_t n);
参数解释
-
dest
:目标内存的起始地址,即要将数据复制到的位置。 -
src
:源内存的起始地址,即要从哪里复制数据。 -
n
:要复制的字节数。
功能
memcpy
函数的作用是将 src
指向的内存区域的前 n
个字节复制到 dest
指向的内存区域。这意味着它能够高效地复制大块内存数据,常用于数组和结构体等数据结构的复制操作。
使用示例:
模拟实现:
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
/*
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
注意事项
memcpy
不会检查内存的边界,因此在使用时要确保dest
和src
指向的内存区域不会发生重叠,否则结果将是不确定的。要处理可能重叠的情况,可以使用memmove
函数。- 在 C++ 中,使用
std::memcpy
可以更好地与命名空间和重载机制配合,避免潜在的命名冲突。
2.memmove
在 C 语言中,memmove
的原型如下:void *memmove(void *dest, const void *src, size_t n);
在 C++ 中,memmove
函数同样可以直接使用,也推荐使用 std::memmove
,其原型在 <cstring>
头文件中声明:void* memmove(void* dest, const void* src, size_t n);
参数解释
-
dest
:目标内存的起始地址,即要将数据复制到的位置。 -
src
:源内存的起始地址,即要从哪里复制数据。 -
n
:要复制的字节数。
功能
memmove
函数与 memcpy
类似,都是将 src
指向的内存区域的前 n
个字节复制到 dest
指向的内存区域。不同的是,memmove
能够正确处理 dest
和 src
指向的内存区域有重叠的情况。具体来说,memmove
保证复制的结果是正确的,无论 src
和 dest
是否有重叠部分。
使用示例:
模拟实现:
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
注意事项
memmove
比memcpy
的实现可能会稍慢,因为它必须确保在处理重叠的情况下也能正确复制数据。- 如果确定
src
和dest
不会重叠,使用memcpy
可能更为高效。