> -----Original Message-----
> From: Vamsi_K [mailto:Vamsi_K@Satyam.com]
> Sent: Wednesday, May 04, 2005 11:23 AM
> To: Vijay Zanvar (WT01 - TELECOM SOLUTIONS)
> Subject: Hii...Small Query
>
>
> Hi Vijay,
>
> Can u please tell me the difference between strcpy() and memcpy().
> How memcpy() is faster for Large strings, eventhough there are 2 passes
> over the data.
>
> Ie, one for strlen() and another is for copying.
> Please give me reply if u find any free time.
>

Following are the prototypes of memcpy() and strcpy().

        #include <string.h>
        void *memcpy(void * restrict s1, const void * restrict s2,
                    size_t n);

        #include <string.h>
        char *strcpy(char * restrict s1, const char * restrict s2);

The effectiveness of memcpy() depends on the two factors:

    * How it is implemented, and
    * The values of `n' and strlen (s2). (see above prototypes)

It is not always that memcpy() is always faster; however, it is
faster/slower in following situations:

    * If strlen(s2) is far greater than `n'

    * If you know the exact number of bytes to be copied
      in advance, then memcpy() more efficient than strcpy()

    * If you use the following method -

            memcpy ( s1, s2, strlen(s2) );

      - then, it will slower than strcpy().

    * If the library implements memcpy() using the fast
      instructions, if any, provided by the host processor.
      For example, Intel CPUs provide the following instructions
      for fast copying:

MOVS/MOVSB/MOVSW/MOVSD—Move Data from String to String
Opcode Instruction      Description
------ -----------      -----------
A4      MOVS m8, m8     Move byte at address DS:(E)SI to address ES:(E)DI
A5      MOVS m16, m16   Move word at address DS:(E)SI to address ES:(E)DI
A5      MOVS m32, m32   Move doubleword at address DS:(E)SI to address ES:(E)DI
A4      MOVSB           Move byte at address DS:(E)SI to address ES:(E)DI
A5      MOVSW           Move word at address DS:(E)SI to address ES:(E)DI
A5      MOVSD           Move doubleword at address DS:(E)SI to address ES:(E)DI

    An simple implementation could be like this:

    char *
    strcpy ( char * restrict s1, const char * restrict s2 )
    {
        /*
         * I didn't cross check the syntax of __asm.
         * Refer "info gcc" for more information
         */
        __asm ( "MOVS s1, s2" );
        return s1;
    }


    However, It is advisable to use str functions for manipulating
strings, instead of using mem functions.  Because, that will
improve readability.

> Thanks & Regards
> Vamsi Krishna.K