2007-08-13 14:03:28

by sk malik

[permalink] [raw]
Subject: why use memcpy when memmove is there?

Hi, All

We were looking at "[kernel]/lib/string.c"
(http://lxr.linux.no/source/lib/string.c#L500)

memcpy copies a part of memory to some other location
but It will not work for all cases of overlapping
blocks.(if the start of destination block falls
between the source block)

while memove copes with overlapping areas.

then why is memcpy present in the sources can't we
simply do

"#define memcpy memmove" in include/linux/string.h

or am I missing something?

Regards
Sri



Unlimited freedom, unlimited storage. Get it now, on http://help.yahoo.com/l/in/yahoo/mail/yahoomail/tools/tools-08.html/


2007-08-13 15:55:00

by Jan Engelhardt

[permalink] [raw]
Subject: Re: why use memcpy when memmove is there?


On Aug 13 2007 11:55, sk malik wrote:
>Subject: why use memcpy when memmove is there?

>memcpy copies a part of memory to some other location
>but It will not work for all cases of overlapping
>blocks.(if the start of destination block falls
>between the source block)
>
>while memove copes with overlapping areas.
>
>then why is memcpy present in the sources can't we
>simply do
>
>"#define memcpy memmove" in include/linux/string.h
>
>or am I missing something?

memmove must copy with overlapping memory segments, while memcpy does not, and
can therefore use a different optimization strategy. But that would have been
apparent if you had looked at the code.


Jan
--

2007-08-13 16:05:58

by Robert Hancock

[permalink] [raw]
Subject: Re: why use memcpy when memmove is there?

sk malik wrote:
> Hi, All
>
> We were looking at "[kernel]/lib/string.c"
> (http://lxr.linux.no/source/lib/string.c#L500)
>
> memcpy copies a part of memory to some other location
> but It will not work for all cases of overlapping
> blocks.(if the start of destination block falls
> between the source block)
>
> while memove copes with overlapping areas.
>
> then why is memcpy present in the sources can't we
> simply do
>
> "#define memcpy memmove" in include/linux/string.h
>
> or am I missing something?

Because the assumption that the areas don't overlap means memcpy can be
more efficient.

--
Robert Hancock Saskatoon, SK, Canada
To email, remove "nospam" from [email protected]
Home Page: http://www.roberthancock.com/

2007-08-13 16:19:48

by Stefan Richter

[permalink] [raw]
Subject: Re: why use memcpy when memmove is there?

sk malik wrote:
> memcpy copies a part of memory to some other location
> but It will not work for all cases of overlapping
> blocks.(if the start of destination block falls
> between the source block)
>
> while memove copes with overlapping areas.
>
> then why is memcpy present in the sources can't we
> simply do
>
> "#define memcpy memmove" in include/linux/string.h
>
> or am I missing something?

The restriction that memcpy is undefined for overlapping areas (IOW, is
only defined for non-overlapping areas) can be used for optimizations in
memcpy which are not possible in memmove. An example, I suppose:
http://lxr.linux.no/source/arch/m68k/lib/string.c#L79
http://lxr.linux.no/source/arch/m68k/lib/string.c#L146
--
Stefan Richter
-=====-=-=== =--- -==-=
http://arcgraph.de/sr/

2007-08-14 22:16:37

by David Schwartz

[permalink] [raw]
Subject: RE: why use memcpy when memmove is there?


> Hi, All
>
> We were looking at "[kernel]/lib/string.c"
> (http://lxr.linux.no/source/lib/string.c#L500)
>
> memcpy copies a part of memory to some other location
> but It will not work for all cases of overlapping
> blocks.(if the start of destination block falls
> between the source block)
>
> while memove copes with overlapping areas.
>
> then why is memcpy present in the sources can't we
> simply do
>
> "#define memcpy memmove" in include/linux/string.h
>
> or am I missing something?

Suppose you have two vehicles, an economy car and a semi truck. The truck
can go everyplace the car can go, and the truck can carry a bigger load. So
why would you ever use the car? Answer: The car uses less gas and you don't
always need a truck.

Think about what it takes to be able to copy one block of memory to another
location when those locations might overlap. You don't always need that.

DS