內存函數以字節為單位更改
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
?可能更為高效。