kyuseo의 게임 프로그래밍

구조체(클래스) 복사 연산자에 관한 고찰 (memcpy VS operator =) 본문

C++ 개발

구조체(클래스) 복사 연산자에 관한 고찰 (memcpy VS operator =)

kyuseo 2007. 11. 18. 13:01

개요..

 

구조체(클래스)를 다른 구조체로 복사 할 경우 memcpy 로 복사를 해야 하는지, operator = 연산자를 사용하여 복사 하는 것이 좋은지 판단하기가 어려운 상황이 있습니다. 어떤 복사방식을 사용하는 것이 좋을지 생각해봅니다.

 

 

특징

 

 

memcpy

operator =

복사방식

구조체 크기의 메모리를 복사한다.

멤버 변수를 각각 '=' 연산을 통하여 복사한다.

속도

빠르다

느리다

주의사항

멤버 중에 CString (일반적인 MFC 클래스) 과 같은 별도로 관리하는 메모리, 포인터 등의 변수가 있을 경우 사용하면 오작동 우려가 있음

 

자료형의 크기를 정확하게 대입해야 한다.

개별적으로 '=' 연산을 하기 때문에 안정성은 뛰어나나 원본과 완벽하게 동일한 메모리 구조를 보장하지 않는다.

 

복사 연산자 '=' 가 정의되지 않은 멤버 변수가 있는 경우

 

 

memcpy 로 사용하거나 '=' 연산자를 사용해도 무방한 경우 :

 

멤버 변수가 기본 자료형 변수로만 이루어저 있는 경우

 

struct BET_MONEY

{

    WORD    seat;

    BYTE    bet_state;

    int    money;

    int    bet_money;

    int    call_money;

    int    ground_money;

};

 

 

BET_MONEY a, b;

 

b = a; // O

 

memcpy( &b, &a, sizeof( BET_MONEY ) ); // O

 

 

memcpy 로 사용불가하고 '=' 연산자를 사용은 가능한 경우

 

멤버 변수에 MFC 변수가 포함된 경우

 

struct NOTE

{

    CString        dest_id;    

    BOOL        is_send;    

    BOOL        is_read;    

    CString    note;        

    CString    dt;

};

 

 

NOTE a, b;

 

b = a; // O

 

memcpy( &b, &a, sizeof(NOTE) ); // X : 컴파일은 성공하지만 CString의 메모리가 올바르게 복사되지 않아 사용중 오류가 발생한다. (매우위험)

 

 

 

memcpy , '=' 연산자모두 사용이 불가능 한 경우

 

멤버 변수에 복사연산자가 사용이 불가능한 변수가 포함된 경우

 

struct BET_MONEY

{

    CUIntArray    card_array;

    int        bet_money;

    int        call_money;

    int        ground_money;

};

 

 

BET_MONEY a, b;

 

b = a; // X : CUIntArray 이 '=' 연산자를 사용할 수 없기 때문에 컴파일 오류가 발생한다.

 

memcpy( &b, &a, sizeof( BET_MONEY ) ); // X : 컴파일은 성공하지만 CUIntArray 의 메모리가 올바르게 복사되지 않아 사용중 오류가 발생한다. (매우위험)