memcpy는 언제 사용하나요?
글쓴이: ktsec / 작성시간: 금, 2005/01/21 - 12:42오전
보통 변수 끼리 값을 복사할경우
int a,b;
a =b;
또는 struct 끼리 값을 복사할경우
struct xxx a,b;
a=b;
위와 같이 메모리에 있는 값이 복사가 되는것으로
알고 있습니다. 결국 메모리끼리 복사가되는데
그럼 memcpy는 언제 사용하나요?
개인적으로는 특정변수가 포인터형식으로 되어있고
크기를 모를때 특정 바이트 수만큼만 복사할 필요가
있을 사용할것 같은데 제 생각이 맞나요?
그리고 bcoy와 차이점이 있나요?
갑자기 개발을 하다가 궁금해서 질문을 던집니다.
Forums:
[code:1]struct xxx a,b; a=b;[/code
이렇게 해 보신 건가용..? -.-;; 확실히 구조체의 내용까지 복사되는 건가요??
저는 memcpy를 이럴 때 사용합니다.
malloc으로 배열을 100개 잡았을 때, 100개의 내용을 유지하면서 101개로 늘려야 할 때가 있습니다. realloc를 쓰면 되겠지만 101개를 malloc하고 101번째의 배열을 초기화하고 1~100까지의 배열을 memcpy로 복사합니다. 물론 기존의 100개짜리는 free() 시키죵..
memcpy가 쓰일 곳은 많습니당... bcopy와의 차이점이라면 man memcpy, man bcopy 해보시면 바로 나옵니다 -.-; 한놈은 리턴값이 있고 한놈은 없습니다. 그리고 b로 시작하는 시리즈(bzero 등..)는 사용하지 않을 것을 권장합니당.. 이유는 역시 남자한테 물어보세용~
확실히 구조체끼리도 복사을 해보았는데 복사가 됩니다.
확실히 구조체끼리도 복사을 해보았는데 복사가 됩니다.
[code:1]struct xxx *a[/code:1]로 착각했습니다 -
struct xxx *a
로 착각했습니다 -_-;;;;;;배열이나 포인터 같은 참조형 자료들 때문이죠. 말씀하신 것과 같이 int
배열이나 포인터 같은 참조형 자료들 때문이죠. 말씀하신 것과 같이 int나 구조체 같은 것들은 직접 값으로 평가될 수 있으므로 할당만으로도 복사가 됩니다. 구조체는 배열과는 달리 함수 인자로 넘긴 후 그 함수에서 sizeof를 해도 원래의 크기를 유지하고 있음을 알 수 있습니다. 그러나 간접연산(dereferencing)이 필요한 자료형이라면 memcpy를 써야 합니다. 프로토타입을 보면 알 수 있듯이요.
void *memcpy(void *dest, const void *src, size_t n);
----
http://nohmad.tumblr.com/
이런 선언이 있고, a의 내용 전부를 b로 복사하는 코드를 작성한다고 합
이런 선언이 있고, a의 내용 전부를 b로 복사하는 코드를 작성한다고 합시다.
코드 하나.
코드 둘.
memcpy(b, a, sizeof(int)*20*30);
어떤가요? :D
memcpy를 유용하게 사용할 수 있는 예 중 하나였습니다. :)
어셈블리로 만들어 보면 보다 이해가 빠릅니다.* 기계 명령어 n개의
어셈블리로 만들어 보면 보다 이해가 빠릅니다.
* 기계 명령어 n개의 반복으로 할것인가?(CPU연산에 적극적)
* 한번의 기계명령으로 할것인가?(때에따라, DMA로 적용되기도.)
당연히 누가 빠른가?
[quote="Anonymous"]* 한번의 기계명령으로 할것인가?(때에
근데 memcpy가 DMA로 구현되는 경우가 실제로 존재하나요?
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
[code:1]struct xxx a,b;a=b; [/code:1]
이게 먹나요?? :shock:
구조체 - 포인터가 아닌 변수 자체 - 끼리의 assign 만으로 값이 복사된다고요??
에이~~ 설마아~~ :roll:
함수의 인자로 넘길때라면 몰라도요.
더 이상 없다.
[quote="k2hyun"][code:1]struct xxx a,b;
구조체끼리는 되지 않나요? 구조체를 포인터 형태로 많이 쓰는 이유중 하나라고 들었습니다. 구조체 assign의 경우 byte-to-byte로 복사됩니다.
[quote="k2hyun"][code:1]struct xxx a,b;
네, 됩니다. 그리고 대부분의 컴파일러에서는 memcpy()로 구현할 것입니다.
배열이 복사/대입되지 않는 것이 불편해서 배열을 갖고 있는 wrapper 구조체를
쓴 적도 있습니다. 가독성 면에서는 훨씬 좋지요.
[quote="ihavnoid"][quote="Anonymous"]* 한
memory mapped I/O를 사용하는 경우 OS, 하드웨어에서 알아서 DMA를 쓰겠네요.
memcpy
typedef로 만든 구조체를 할당문을 사용하면...
Windows에서는 디버거로 뒤져보면.. memcpy를 사용하더군요.
그리고.. X86 머신의 경우
DOS 시절에는 DMA 채널이 메모리와 메모리간에는 막혀있었던걸로 기억합니다.
dos4gw나 pmode등의 DOS Extender가 유행할때
메모리와 메모리간 DMA 전송을 하는 예를 본적 있는걸로 기억도 나는데...
DMA 컨트롤러를 이용하는게 얼마나 효용성이 있을지는 잘 모르겠습니다.
정말로 빠른 복사를 원한다면
어셈블러 레벨에서 prefetch 명령을 이용한 복사가 더빠를걸로 생각하고
백그라운드 복사가 필요해서 DMA를 이용한다면.. 모를까..
Re: memcpy는 언제 사용하나요?
저의 경우 memcpy를 가장 많이 사용할때가..
이미지 처리할때더군요.
하는 일이 도큐먼트 이미징, 컴퓨터 비젼 쪽이라... ^^;
댓글 달기