memcpy는 언제 사용하나요?

ktsec의 이미지

보통 변수 끼리 값을 복사할경우
int a,b;
a =b;

또는 struct 끼리 값을 복사할경우
struct xxx a,b;
a=b;

위와 같이 메모리에 있는 값이 복사가 되는것으로
알고 있습니다. 결국 메모리끼리 복사가되는데
그럼 memcpy는 언제 사용하나요?

개인적으로는 특정변수가 포인터형식으로 되어있고
크기를 모를때 특정 바이트 수만큼만 복사할 필요가
있을 사용할것 같은데 제 생각이 맞나요?
그리고 bcoy와 차이점이 있나요?

갑자기 개발을 하다가 궁금해서 질문을 던집니다.

소타의 이미지

struct xxx a,b; 
a=b;

이렇게 해 보신 건가용..? -.-;; 확실히 구조체의 내용까지 복사되는 건가요??

저는 memcpy를 이럴 때 사용합니다.
malloc으로 배열을 100개 잡았을 때, 100개의 내용을 유지하면서 101개로 늘려야 할 때가 있습니다. realloc를 쓰면 되겠지만 101개를 malloc하고 101번째의 배열을 초기화하고 1~100까지의 배열을 memcpy로 복사합니다. 물론 기존의 100개짜리는 free() 시키죵..

memcpy가 쓰일 곳은 많습니당... bcopy와의 차이점이라면 man memcpy, man bcopy 해보시면 바로 나옵니다 -.-; 한놈은 리턴값이 있고 한놈은 없습니다. 그리고 b로 시작하는 시리즈(bzero 등..)는 사용하지 않을 것을 권장합니당.. 이유는 역시 남자한테 물어보세용~

ktsec의 이미지

확실히 구조체끼리도 복사을 해보았는데 복사가 됩니다.

소타의 이미지

struct xxx *a로 착각했습니다 -_-;;;;;;

nohmad의 이미지

배열이나 포인터 같은 참조형 자료들 때문이죠. 말씀하신 것과 같이 int나 구조체 같은 것들은 직접 값으로 평가될 수 있으므로 할당만으로도 복사가 됩니다. 구조체는 배열과는 달리 함수 인자로 넘긴 후 그 함수에서 sizeof를 해도 원래의 크기를 유지하고 있음을 알 수 있습니다. 그러나 간접연산(dereferencing)이 필요한 자료형이라면 memcpy를 써야 합니다. 프로토타입을 보면 알 수 있듯이요.

void *memcpy(void *dest, const void *src, size_t n);

소리의 이미지

이런 선언이 있고, a의 내용 전부를 b로 복사하는 코드를 작성한다고 합시다.

int a[20][30];
int b[20][30];

코드 하나.

int i, j;

for (i = 0; i < 20; i++) {
    for (j = 0; j < 30; j++) {
        b[i][j] = a[i][j];
    }
}

코드 둘.
memcpy(b, a, sizeof(int)*20*30);

어떤가요? :D
memcpy를 유용하게 사용할 수 있는 예 중 하나였습니다. :)

익명 사용자의 이미지

어셈블리로 만들어 보면 보다 이해가 빠릅니다.
* 기계 명령어 n개의 반복으로 할것인가?(CPU연산에 적극적)
* 한번의 기계명령으로 할것인가?(때에따라, DMA로 적용되기도.)

당연히 누가 빠른가?

ihavnoid의 이미지

Anonymous wrote:
* 한번의 기계명령으로 할것인가?(때에따라, DMA로 적용되기도.)

근데 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

k2hyun의 이미지

struct xxx a,b;
a=b; 

이게 먹나요?? :shock:

구조체 - 포인터가 아닌 변수 자체 - 끼리의 assign 만으로 값이 복사된다고요??

에이~~ 설마아~~ :roll:

함수의 인자로 넘길때라면 몰라도요.

더 이상 없다.

cocas의 이미지

k2hyun wrote:
struct xxx a,b;
a=b; 

이게 먹나요?? :shock:

구조체 - 포인터가 아닌 변수 자체 - 끼리의 assign 만으로 값이 복사된다고요??

에이~~ 설마아~~ :roll:

함수의 인자로 넘길때라면 몰라도요.

구조체끼리는 되지 않나요? 구조체를 포인터 형태로 많이 쓰는 이유중 하나라고 들었습니다. 구조체 assign의 경우 byte-to-byte로 복사됩니다.

doldori의 이미지

k2hyun wrote:
struct xxx a,b;
a=b; 

이게 먹나요?? :shock:

구조체 - 포인터가 아닌 변수 자체 - 끼리의 assign 만으로 값이 복사된다고요??

에이~~ 설마아~~ :roll:

함수의 인자로 넘길때라면 몰라도요.


네, 됩니다. 그리고 대부분의 컴파일러에서는 memcpy()로 구현할 것입니다.
배열이 복사/대입되지 않는 것이 불편해서 배열을 갖고 있는 wrapper 구조체를
쓴 적도 있습니다. 가독성 면에서는 훨씬 좋지요.
cocas의 이미지

ihavnoid wrote:
Anonymous wrote:
* 한번의 기계명령으로 할것인가?(때에따라, DMA로 적용되기도.)

근데 memcpy가 DMA로 구현되는 경우가 실제로 존재하나요?

memory mapped I/O를 사용하는 경우 OS, 하드웨어에서 알아서 DMA를 쓰겠네요.

simpid의 이미지

typedef로 만든 구조체를 할당문을 사용하면...

Windows에서는 디버거로 뒤져보면.. memcpy를 사용하더군요.

그리고.. X86 머신의 경우
DOS 시절에는 DMA 채널이 메모리와 메모리간에는 막혀있었던걸로 기억합니다.

dos4gw나 pmode등의 DOS Extender가 유행할때
메모리와 메모리간 DMA 전송을 하는 예를 본적 있는걸로 기억도 나는데...

DMA 컨트롤러를 이용하는게 얼마나 효용성이 있을지는 잘 모르겠습니다.

정말로 빠른 복사를 원한다면
어셈블러 레벨에서 prefetch 명령을 이용한 복사가 더빠를걸로 생각하고
백그라운드 복사가 필요해서 DMA를 이용한다면.. 모를까..

simpid의 이미지

ktsec wrote:
보통 변수 끼리 값을 복사할경우
int a,b;
a =b;

또는 struct 끼리 값을 복사할경우
struct xxx a,b;
a=b;

위와 같이 메모리에 있는 값이 복사가 되는것으로
알고 있습니다. 결국 메모리끼리 복사가되는데
그럼 memcpy는 언제 사용하나요?

개인적으로는 특정변수가 포인터형식으로 되어있고
크기를 모를때 특정 바이트 수만큼만 복사할 필요가
있을 사용할것 같은데 제 생각이 맞나요?
그리고 bcoy와 차이점이 있나요?

갑자기 개발을 하다가 궁금해서 질문을 던집니다.

저의 경우 memcpy를 가장 많이 사용할때가..
이미지 처리할때더군요.

하는 일이 도큐먼트 이미징, 컴퓨터 비젼 쪽이라... ^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.