Original version:
Void * memcpy (void * DEST, const void * SRC, size_t count) <br/>{< br/> assert (DEST! = NULL) & (SRC! = NULL); <br/> char * temp_dest = (char *) DEST; <br/> char * temp_src = (char *) SRC; <br/> while (count --) // do not judge whether overlapping areas exist <br/> {<br/> * temp_dest ++ = * temp_src ++; <br/>}< br/> return DEST; <br/>}
Improvement 1:
Void * memcpy (void * DEST, void * Source, size_t count) </P> <p >{</P> <p> void * ret = DEST; </P> <p> If (DEST <= source | DEST> = (source + count )) </P> <p >{</P> <p> // non-overlapping buffers <br/> // copy from lower addresses to higher addresses </P> <p>> while (count --) </P> <p> * DEST ++ = * Source ++; </P> <p >}</P> <p> else </P> <p >{</P> <p> // overlapping buffers <br/>/ /copy from higher addresses to lower addresses </P> <p> DEST + = count-1; </P> <p> source + = count-1; </P> <p> while (count --) </P> <p> * dest -- = * source --; L </P> <p >}</P> <p> return ret; </P> <p>}
Improvement 2:
Void memcpy (void * DEST, const void * SRC, size_t N) </P> <p >{</P> <p> assert (uintptr_t) deST | (uintptr_t) SRC | N) & 0x03) = 0); </P> <p> uint32_t * D = (uint32_t *) DEST; </P> <p> const uint32_t * s = (uint32_t *) SRC; </P> <p> N/= sizeof (uint32_t ); </P> <p> If (d <s) {</P> <p>/* Copy forward */</P> <p> while (n --) {</P> <p> * D ++ = * s ++; </P> <p >}</P> <p >}else {</P> <p>/* Copy backward */</P> <p> D + = N; </P> <p> S + = N; </P> <p> while (n --) {</P> <p> * -- d = * -- S; </P> <p >}</P> <p>}