C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[826] memcpy와 memmove의 차이점.
김태선 [cppbuilder] 14205 읽음    2008-12-02 22:00
메모리 복사 명령은 전통적으로, 어셈블리 특성상
인접한 상위 메모리에서 하위 메모리 즉 높은 번지의 메모리에서 낮은 번지의 메모리로
복사하는 것이 자연스럽습니다.
하지만 반대로 인접한 낮은 번지에서 높은 번지로 데이타를 복사 전송하는 것은
한번에 안되고  각 메모리 내용을 높은 번지부터 아래로 하나씩 복사해주는 방법을 씁니다.

이런 방법은 전송하는 메모리의 번지가 인접해 겹칠때 문제가 되기 때문입니다.

이런 생각 없이 그냥 코딩해 볼까요.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	enum { Size = 10};
	int	data[Size];
	for(int c = 0; c < Size; c++)
		data[c] = c; // test data 

	memcpy(data, data + 1, sizeof(data) - sizeof(int)); // 1,2,3,4,5,6,7,8,9,9 이렇게 되죠.
	memcpy(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,1,1,1,1,1,1,1,1 이런 결과가 나옵니다.
}


하지만 이를 영리하게 처리해주는 함수가 있습니다.
즉 번지의 인접성을 전혀 걱정하지 않아도 정확하게 메모리 내용이 원하는 대로
복사되는 것은 memmove 입니다.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	enum { Size = 10};
	int	data[Size];
	for(int c = 0; c < Size; c++)
		data[c] = c;

	memmove(data, data + 1, sizeof(data) - sizeof(int)); // 1,2,3,4,5,6,7,8,9,9 이렇게 되죠.
	memmove(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,2,3,4,5,6,7,8,9 이렇게 됩니다.
}


이렇게 잘 됩니다.

그런데
    memcpy(data + 1, data, sizeof(data) - sizeof(int)); // 1,1,1,1,1,1,1,1,1,1.
이렇게 된다는 특성은, 메모리를 동일한 내용으로 채우는 가장 빠른 방법을 말해주는 것입니다.
일일이 for loop를 돌며 데이타를 동일화 하지 않아도 된다는 것이죠.

간단한 것이고 오래전에 알았는데 몇 년 안쓰다 보니 잊어버려서
나이든 플머를 위해 기록해 둡니다.
장성호 [nasilso]   2008-12-03 02:01 X
c를 한다면 memcpy , memmove 의 차이는 꼭 알아야 할 사항이죠

델파이나 C++Builder를 하는경우 CopyMemory , MoveMemory 라는게 있습니다.
그런데 Windows.pas 에 있는데 C++Builder의 명시적으로 Export 되어있지 않더군요
그래도 사용하는데는 지장이 없네요

vcl의 CopyMemory , MoveMemory  는 둘다 memmove처럼 내부적으로 move 방식을 이용합니다.
그런데 memmove와 다른것은 win32 system의 기본형인 4Byte(32bit)씩 copy하고
남은것은 1Byte씩 copy하구....

그래서 memcpy,memmove보다 CopyMemory,MoveMemory를 이용하는것이 빠를것입니다.
image(영상)처리같이 Copy/Move작업이 많은경우에는 CopyMemory,MoveMemory를 이용하는것이 좋을듯 합니다.
김지성 [kidream]   2008-12-03 07:47 X
딴지는 아닙니다만, memcpy 하고 memmove 같아진지 꽤 오래된걸로 기억하는데요.
적어도 VC는 6.0 때에도 동일한걸로 알고 있습니다. (소스를 보면 동일합니다)

김태선 [cppbuilder]   2008-12-03 10:14 X
저 결과물은 빌더6에서 테스트한 결과입니다.
memcpy 하고 memmove는 동작 방식이 틀리기 때문에 같게 하지는 못할 것입니다.
김지성 [kidream]   2008-12-03 19:46 X
흠...그렇네요.. c++ builder 쪽 소스를 보니 memcpy 와 memmove 소스가 틀리군요.
vc쪽에서는 memmove 와 memcpy가 동일하게 되어 있거든요. 잘 알았네요.
특히나 vc쪽에서 잘 돌아가던 소스가 c++ builder에서 안돌아갈 가능성 있는 부분 중에 하나라는 것을요..
용맨소녀 [doyongid]   2008-12-22 16:36 X
모바일게임에서 화면 상하스크롤하는데, 자꾸 겹쳐 출력되어서 왜 그런지 의아했던 적이 있었지요.. 생각해보면 그 전까지는 자기복사를 안해봤는지라..;;;
김태선 [cppbuilder]   2009-01-02 14:11 X
VC에서는 memcpy가 memmove와 동작이 같습니다.
이는 memcpy가 수정되어 memmove 처럼 memcpy가 동일화 된 것입니다.

하지만 빌더에서는 원래의 memcpy가 가졌던 특수한 메모리 복사 동작을 그대로 유지시키기 위해
그대로 두고 있습니다. 빌더에서는 다른 두가지 동작 방식을 그대로 유지하고 있는 것이죠.

+ -

관련 글 리스트
826 memcpy와 memmove의 차이점. 김태선 14205 2008/12/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.