C++内存操作函数

void* memcpy(void* dest , void* src, size_t length)函数:函数从src的起始位置复制length个字节到dest的内存起始位置,它并不关心数据类型,只是逐字节的进行复制。

注意点:

1、dest指针要分配足够的空间,大于或等于 length个字节的空间。如果没有分配空间,会出现断错误。

2、dest和src所指的内存空间不能重叠。即dest < src 或 dest > src+length

源码:

void memcpy (void* dest , const void* src , size_t length) {

    assert(src);

    char* pdest = (char*)pdest;

    const char* psrc = (const char*)src;

    while(length--) {

        *pdest = *psrc;

        pdest++;

        psrc++;

    }

}

memcpy函数并不关系数据类型,它只是逐字节的复制。


memmove(void* dst,void const * src,size_t length)函数:

与memcpy功能一样,只是这里它会考虑内存重叠的问题,当src和dest存在重叠时,它同样可以正确处理,不过执行效率会比memcpy慢一些。

源码:

void* memmove (void* dst , void const * src , size_t length) {

    char * tmp;

    char * s;

    if (dst < src || dst > src+length) {

        tmp = dst ;

        s = src ;

        while (length--){

            *tmp = *s;

            tmp++;s++;

        } else {

            //存在内存重叠,从尾向前开始拷贝

            tmp = dst;

            tmp += count;

            s = src;

            s += count;

            while (length--) {

                *tmp = *s;

                tmp--; s--;

            }

        }

    }    

    return dst;

}

注意点:

void* 类型是不能进行计算的,必须转换为char*


void* memset(void* a, int ch , size_t length)函数

函数memset是从a开始的length个字节都设置成字符ch,memset可以将一段内存空间全部设置为特定的值,所以经常用来初始化字符串数组。逐字节拷贝。万能的初始化工具。

源码:

void* memset ( void* dest , int ch , size_t length) {

    const unsigned char uc = ch;

    char* su;

    for ( su=dest ; length>0 ; su++,length--) {

        *su = ch;

    }

    return dest;

}

memset函数是逐字节拷贝,利用memset进行初始化复制比手动复制要快的多,适合于进行初始化。

使用memset的时候要格外小心,在给char以外的数据赋值时,只能初始化为0或者-1;



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值