: move ์์ฑ์์ move ๋์
์ ์ noexcept๋ฅผ ์์ฑํด์ผ ํ๋์ง
๊ทธ๋ฆฌ๊ณ move_if_noexcept๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์.
: ์ด๋์์ฑ์์ ์ด๋ ๋์ ์ฐ์ฐ์ ์ ์์์๋ ๋ฐ๋์ noexcept๋ฅผ ๋ถ์ด์.
vector์ ๊ฒฝ์ฐ, ์ ์ ์ ์ ํด๋์ค์์์ ์ด๋์์ฑ์์ ์ด๋ ๋์ ์ noexcept ์์ฑ๋์ง ์์ผ๋ฉด, ์ด๋ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ์ธํ๋ ์ฝ๋๋
vector v(2);
v.resize(4); ๋ฅผ ํ๋ฉด move ์ฐ์ฐ์ด ์ถ๋ ฅ๋์ด์ผ ํ๋๋ฐ, copy๊ฐ ๋ฐ์ํ ๊ฒ์
ํ์ธํ ์ ์์๋ค.
is_nothrow_move_constructible
: ํด๋์ค์ ์ด๋์์ฑ์์์ ์์ธ๊ฐ ์์ผ๋ฉด, true / ์์ผ๋ฉด false๋ฅผ ๋ฐํํจ.
move_if_noexcept(Object)
: ๊ฐ์ฒด๊ฐ ์์ธ๊ฐ ์์ผ๋ฉด, ๋ณต์ฌ๋ฅผ ํธ์ถ,
๊ฐ์ฒด๊ฐ ์์ธ๊ฐ ์์ผ๋ฉด ์ด๋์ ํธ์ถํ๊ฒ ํ๋ ํค์๋
- ์ด๋์์ฑ์๋ ์ด๋๋์ ์ฐ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋, ํฌ์ธํฐ๊ฐ์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ฐ, ํฌ์ธํฐ์ ๋ณต์ฌ๋ ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก, noexcept๋ฅผ ๋ช ์ํ๋๋ก ํ์. -> ํ์ฌํผ ์ค์ํ ๋ถ๋ถ์ ํฌ์ธํฐ ๋์ ์ ๊ฒฝ์ฐ, ์์ ๋ณต์ฌ๋ผ๋ ๊ฒ์
์ธ์งํด์ผ ํ๋ค.
๊ฒฐ๋ก
- ์ด๋์์ฑ์์ ์ด๋๋์ ์ฐ์ฐ์์ noexcept๋ฅผ ๋ช ์ํด์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ์.
problem
: char* ์ ๋ฉค๋ฒ๋ก ๊ฐ์ง๊ณ ์๋ Object ํด๋์ค๋ฅผ ๋ง๋ ํ,
์์ฑ์ 3๊ฐ, ์๋ฉธ์, ๋์ ์ฐ์ฐ์ 2๊ฐ ๋ง๋ค์.
vector v(2); v.resize(4) ; ํธ์ถํ์.
- vector ์ ์ด๊ธฐํ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๊น?
#include <iostream> #include <thread> #include <future> #include <chrono> using namespace std; #include <numeric> #include <future> class Object { private : char *name; public : Object(const char*_name) { name = new char[strlen(_name) + 1]; strcpy(name, _name); cout << "const char* constructor" << endl; } ~Object() { delete[] name; cout << "destructor" << endl; } Object(const Object&_obj) { name = new char[strlen(_obj.name) + 1]; strcpy(name, _obj.name); cout << "copy constructor" << endl; } Object(Object&& _obj)noexcept : name{_obj.name} { _obj.name = nullptr; cout << "move constructor" << endl; } Object& operator=(const Object& _obj) { delete[]name; name = new char[strlen(_obj.name) + 1]; cout << "operator= copy" << endl; } Object& operator=(Object&& _obj) noexcept { name = _obj.name; _obj.name = nullptr; cout << "operator= copy" << endl; } Object() { cout << "basic constructor" << endl; } }; int main() { vector<Object>v(4, "zzok"); cout << "hello" << endl; v.resize(7); }
- ๊ฒฐ๊ณผ
1) ๋งจ ์ฒ์์ 4๊ฐ ๋ง๋ค๊ณ , zzok ์ ๋ฃ์ด์ฃผ๊ณ ์๋๋ฐ,
๊ธฐ๋ณธ ์์ฑ์(zzok) ์ ๋ง๋ค๊ณ , 4๊ฐ๋ฅผ ๋ณต์ฌํจ.
2) ์ดํ, resize(7) ์์๋ ๊ธฐ๋ณธ ์์ฑ์ 3๊ฐ ๋ง๋ค๊ณ ,
๊ธฐ์กด์ ๋ง๋ค์ด๋์ 4๊ฐ๋ฅผ move ์ํค๊ณ ์์.
- 1) ๊ฐ์ฒด p1์ ๋ง๋ค๊ณ , ๊ฐ์ฒด p2์๋ค๊ฐ ์ด๋ ์์ธ์ฒ๋ฆฌ ํจ์๋ฅผ ์ด์ฉํด ๋์ ํด ์์์ ์ฎ๊ธฐ์. (๋ณต์ฌ ์ด๋ ์๋ฉธ ์์ฑ ๋ชจ๋ ๋ง๋ค์ด์ผ ํจ.)
- 2) move ์์ฑ์๋ค๊ฐ noexcept ์ฒ๋ฆฌํด์ , ๋ค์ ์คํํ๋ผ.
move_if_noexcept
: move ํ ๋ ์์ธ๊ฐ ์๋ค๋ฉด, copy ๊ฐ ์ผ์ด๋๊ฒ ํ๊ณ ,
์์ธ๊ฐ ์๋ค๋ฉด, move๋ฅผ ๋ฐ์์ํด.move ์์ฑ์์ move ์ด๋ ์ฐ์ฐ์์ noexcept๊ฐ ์๋ค๋ฉด, copy๊ฐ ๋ฐ์ํจ.
ํ์ธ ์ฝ๋ 1๋ฒ.
: move_if_noexcept๋ฅผ ์์ฑํ๊ณ ์ถ๋ ฅ ํ์ธํด๋ณด๋ฉด, move ๊ฐ ์ถ๋ ฅ๋์ง ์๊ณ , copy๊ฐ ์ถ๋ ฅ๋จ์ ํ์ธํ ์ ์์.
ํ์ธ ์ฝ๋ 2๋ฒ
: ์ด๋ ์์ฑ์์ ์ด๋ ์ฐ์ฐ์์ noexcept๋ฅผ ์์ฑํ๊ณ , ๋ค์ ํ์ธํด๋ณด์.
-> move๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์.