일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 윈윈전략
- 포커게임
- holdem
- 틀린그림찾기
- 옥션소송
- 홀뎀
- 영어단어
- 판매
- 프로그램 개발
- 틀린그림 찾기
- 보드게임
- 포커
- 서치아이
- 프로그램 외주
- 윈윈
- 상호링크
- 카일레라
- 써치아이
- 맞고게임
- 고스톱
- 맞고
- 옥션해킹
- 게임 외주
- 게임 개발
- 온라인게임
- 티스토리 초대장
- Mame32
- MAME
- 카일레라서버
- 영어단어게임
- Today
- Total
kyuseo의 게임 프로그래밍
구조체(클래스) 복사 연산자에 관한 고찰 (memcpy VS operator =) 본문
개요.. |
구조체(클래스)를 다른 구조체로 복사 할 경우 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 의 메모리가 올바르게 복사되지 않아 사용중 오류가 발생한다. (매우위험) |