πŸ˜΅β€πŸ’«(μ½”λ”© κ·œμΉ™ )볡사 및 이동 μ²˜λ¦¬μ‹œ λͺ¨λ“  멀버듀도 이동 μ²˜λ¦¬ν•˜μž.

보물창고·2023λ…„ 1μ›” 3일
0

c++Intermediate μ½”λ“œλˆ„λ¦¬

λͺ©λ‘ 보기
45/62
post-thumbnail

μΆ”κ°€ 240803

: funda c++ p.281~ λΆ€ν„° λ‚΄μš©μžˆλ‹€.

  • 상속 μƒνƒœμ—μ„œ νŒŒμƒ κ°μ²΄κ°„μ˜ 볡사 λ°œμƒμ‹œ 암묡적 μƒμ„±ν•˜λŠ” λ””ν΄νŠΈ νŒŒμƒ λ³΅μ‚¬μ—μ„œλŠ” 상속 객체와 멀버 κ°μ²΄κ°„μ˜ 볡사도 μ•Œμ•„μ„œ μ§„ν–‰ν•œλ‹€.
    -> 증λͺ…ν•˜κΈ° μœ„ν•΄μ„œ 포인터 ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ ν™•μΈν–ˆλ– λ‹ˆ 얕은 볡사 λ°œμƒν•˜λŠ” 것을 확인할 수 μžˆλ‹€.
  • but, μœ μ € μ •μ˜ λ³΅μ‚¬μ—μ„œλŠ” νŒŒμƒ κ°μ²΄κ°„μ˜ λ³΅μ‚¬μ‹œ 기반 ν΄λž˜μŠ€μ™€ 멀버 객체의 μƒμ„±μžκ°€ ν˜ΈμΆœλœλ‹€.
    -> μœ„μ˜ λ‚΄μš©λŒ€λ‘œ 정말 μœ μ €κ°€ μ„ μ²˜λ¦¬ μ˜μ—­μ—μ„œ 볡사 μ½”λ“œ μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ‹ˆ κΈ°λ³Έ μƒμ„±μžκ°€ ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆλ‹€.

핡심

: move μƒμ„±μž 및 이동 λŒ€μž…μ—°μ‚°μžλ₯Ό λ§Œλ“€λ•Œ, 객체의 λͺ¨λ“  멀버듀도 λͺ¨λ‘ move μ²˜λ¦¬ν•˜μž.

problem

: μ•„λž˜μ˜ κ·Έλ¦Όμ—μ„œ move μ²˜λ¦¬ν•΄μ„œ Test 멀버도 move μ²˜λ¦¬λ˜λŠ”μ§€λ₯Ό ν™•μΈν•˜μž.


move μƒμ„±μž λ§Œλ“€κΈ° 예제

  • 이와 같은 클래슀λ₯Ό λ§Œλ“¦. : 볡사 생성 λ§Œλ“€κ³ , ν˜ΈμΆœκΉŒμ§€ 진행함.

  • μ΄λ™μƒμ„±μžλ₯Ό λ§Œλ“€κ³ , moveλ₯Ό ν˜ΈμΆœν•˜μž.
    : 포인터인 buf인 경우, move ν•΄μ•Όν•  일을 μˆ˜ν–‰ν•¨. : λ©”λͺ¨λ¦¬ 이전 및 null처리
    -> 좜λ ₯ν•΄λ³΄λ‹ˆκΉŒ.... copyκ°€ λ°œμƒν•¨μ„ 확인할 수 μžˆλ‹€.

    -> testλŠ” copyκ°€ 좜λ ₯λ˜λŠ” 것을 확인할 수 있음.
    λ‹Ήμ—°ν•œ 것이닀. λ‚˜μ˜ Object μ΄λ™μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”λ¦¬μŠ€νŠΈμ—μ„œλŠ” move 처리λ₯Ό
    ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μ΄λ™μƒμ„±μžλ₯Ό λ§Œλ“€λ•Œ 각 멀버듀도 λ°˜λ“œμ‹œ μ΄λ™μ²˜λ¦¬ν•˜μž.

: λͺ¨λ“  멀버듀에 λŒ€ν•΄μ„œ move μ²˜λ¦¬ν•΄μ„œ μ΄λ™μƒμ„±μžκ°€ ν˜ΈμΆœλ˜λ„λ‘ ν•˜μž.
-> μ•„λž˜ μ½”λ“œλ₯Ό 보면, λͺ¨λ“  멀버에 λŒ€ν•΄ move ν•΄μ„œ 보내고 μžˆλŠ” 것을 확인할 수 있음.

  • λ³€κ²½ μ½”λ“œ

κ²°λ‘ 

  • μ΄λ™μƒμ„±μžμ˜ λͺ¨λ“  멀버λ₯Ό move μ²˜λ¦¬ν•˜μž.

  • μ΄λ™μƒμ„±μžλ₯Ό λ§Œλ“€ λ•Œ, moveν•˜λŠ” λͺ©μ μΈ ν¬μΈν„°μ˜ λ©”λͺ¨λ¦¬ 이전
    즉 얕은 볡사 + μ΄μ „ν•˜λ €λŠ” 포인터λ₯Ό null 둜 λ§Œλ“€μ–΄μ•Ό 함.

μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ λ§Œλ“€μ–΄μ£ΌλŠ” μ΄λ™μƒμ„±μž.

: 볡사 μƒμ„±μžμ™€ μ΄λ™μƒμ„±μžλ₯Ό μœ μ €κ°€ 직접 μ •μ˜ν•΄ 주지 μ•ŠμœΌλ©΄, μ»΄νŒŒμΌλŸ¬κ°€
μ•Œμ•„μ„œ λ””ν΄νŠΈ λ³΅μ‚¬μƒμ„±μžμ™€ λ””ν΄νŠΈ μ΄λ™μƒμ„±μžλ₯Ό ν˜ΈμΆœν•¨.

  • κ΄€λ ¨ μ½”λ“œ
    : ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ ν•˜λ©΄, 포인터가 얕은볡사 λ˜λ―€λ‘œ, λ¬Έμ œκ°€ 생김.

  • 포인터λ₯Ό μ£Όμ„μ²˜λ¦¬ν•˜κ³  λ‹€μ‹œ ν™•μΈν•΄λ³΄μž.
    -> μˆ˜μ—… λ‚΄μš©μ—μ„œλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ 볡사와 μ΄λ™μƒμ„±μžλ₯Ό λ§Œλ“€κ³ ,
    μ΄λ™μƒμ„±μž λ‚΄λΆ€μ—μ„œλ„ λͺ¨λ“  멀버에 λŒ€ν•΄ move μ²˜λ¦¬ν•˜κ³  있음.
    : but λ‚΄ μ»΄νŒŒμΌλŸ¬λŠ” λ³΅μ‚¬μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ³  있음.

  • κ²°κ³Ό
    1) κ·Έλƒ₯ μ΄λ™μƒμ„±μžλ₯Ό λ§Œλ“€κ³ , λͺ¨λ“  멀버λ₯Ό move μ²˜λ¦¬ν•˜μž...
    2) μ•„λ‹ˆλ©΄, 멀버λ₯Ό 슀마트 ν¬μΈν„°λ‘œ μ‚¬μš©ν•˜μž.

μ΅œμ’… μ½”λ“œ

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
#include <type_traits>

class Test
{
public:
	Test() {}
	~Test() {  }
	Test(const Test& obj){
		cout << "copy constr" << endl;}
	Test(Test&& obj) { 
		cout << "move constr" << endl; }
	Test& operator=(const Test& obj)
	{
		cout << "copy=" << endl;
		return *this;
	}
	Test& operator= (Test&& obj)noexcept
	{
		cout << "move=" << endl;
		return *this;
	}
};


class Object
{
	size_t sz;
	//int* buf;
	string tag;
	Test test;

public : 
	Object(size_t s, string t)
		: sz(s), tag(t) /*buf(new int[s])*/ {}
	~Object() { /*delete buf;*/ }
	//Object(const Object& obj) : tag(obj.tag), test(obj.test), sz(obj.sz)
	//{
	//	buf = new int[sz];
	//	memcpy(buf, obj.buf, sizeof(int) * sz);
	//}
	//
	//Object(Object&& obj) noexcept
	//	: tag(move(obj.tag)) ,  test(move(obj.test)) , sz(move(obj.sz))
	//{
	//	buf = obj.buf;
	//	obj.buf = NULL;
	//}
};

int main()
{
	Object a(4, "bomi");
	Object b(move(a));
	Object c = a;

}
profile
πŸ”₯πŸ”₯πŸ”₯

0개의 λŒ“κΈ€