본문 바로가기

C++

구조체 대입 연산

[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