[1. 개요]
구조체 간 대입 연산 시 생각 해 볼 만한 부분?
별도로 복사 생성자나 대입 연산자 등을 구현하지 않으면, 컴파일러가 디폴트로 제공하는 것을 사용하게 되는데
멤버의 고정 길이를 갖는 배열이 있다면?
- Q) 얕은 복사가 발생하지 않나?
- A) 배열의 이름은 배열의 시작 주소를 포현하는 포인터이지만, 배열의 이름은 수정 할 수 없는 값이다.
따라서, 컴파일러는 고정 길이의 배열을 대상으로 깊은 복사를 하도록 디폴트 메소드를 제공한다.
어떻게 구현할지는 컴파일러 마다 다를 수 있음. (단, 배열은 그 크기를 아므로 memcpy 를 통해서 할 수 도 있다...)
[2. 예제]
#include <iostream>
#include <cstring>
struct Mystruct {
int A;
int B;
char name[64];
#ifdef MYASSIGN
Mystruct& operator=(const Mystruct &ref) {
A = ref.A;
B = ref.B;
#ifdef MYERROR
name = ref.name;
#endif
return *this;
}
#endif
};
int main()
{
Mystruct any{1, 2, "any"};
Mystruct who;
memset(&who, 0, sizeof(who));
who = any;
std::cout << "[" << any.name << "]" << std::endl;
std::cout << "[" << who.name << "]" << std::endl;
return 0;
}
결과 | |
매크로 정의 하지 않음. | [any] [any] |
MYASSIGN 만 정의 | [any] [] |
MYASSIGN 과 MYERROR 모두 정의 | test.cpp:14:14: error: invalid array assignment 14 | name = ref.name; | ^~~~ |
'C++' 카테고리의 다른 글
bitfield 사용 시 유의할 점 (0) | 2025.04.28 |
---|---|
OS 별 select() 함수 사용법 (0) | 2025.04.24 |
Segmentation fault 사례4 (0) | 2025.04.14 |
Segmentation fault 사례3 (0) | 2025.04.14 |
Segmentation fault 사례2 (0) | 2025.04.01 |