๐Ÿ”ฅ์ฝ”๋”ฉ ๊ทœ์น™ move ์™€ noexcept

๋ณด๋ฌผ์ฐฝ๊ณ ยท2022๋…„ 12์›” 31์ผ
0

c++Intermediate ์ฝ”๋“œ๋ˆ„๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
41/62

ํ•™์Šต ๋ชฉํ‘œ

: move ์ƒ์„ฑ์ž์™€ move ๋Œ€์ž…์— ์™œ noexcept๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€
๊ทธ๋ฆฌ๊ณ  move_if_noexcept๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

๐Ÿ”ฅ๊ฒฐ๋ก 

: ์ด๋™์ƒ์„ฑ์ž์™€ ์ด๋™ ๋Œ€์ž…์—ฐ์‚ฐ์ž ์ œ์ž‘์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ noexcept๋ฅผ ๋ถ™์ด์ž.


  • a์—์„œ c๋กœ move๋Š” ์„ฑ๊ณตํ–ˆ์ฐŒ๋งŒ, b์—์„œ d๋กœ ์ด๋™ํ• ๋•Œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.
  • ์˜ˆ์™ธ ๋ฐœ์ƒ ์—ฌ๋ถ€์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ๋ธ”๋กœ๊ทธ๋กœ ๊ฐ€์ž.
    -> move์™€ ์˜ˆ์™ธ์— ๋Œ€ํ•ด์„œ ์ œ๋ชฉ ์ฐธ๊ณ .

๐ŸŒ’(์ค‘์š” : c++ ์ƒ์‹)move ์ƒ์„ฑ์ž์™€ ๋Œ€์ž…์—๋‹ค๊ฐ€ noexcept๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • ์™ธ์šฐ์ž.
    - c++์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, (์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ) ์˜ˆ์™ธ ๋ฐœ์ƒ์„ ๋Œ€๋น„ํ•ด์„œ, move ๋ฅผ ํ•˜๋”๋ผ๋„ ๊ทธ๋ƒฅ! ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์„ค๊ณ„๋ฅผ ํ–ˆ๋‹ค.
    -> ๋”ฐ๋ผ์„œ move ์ƒ์„ฑ์ž์™€ move ๋Œ€์ž…์—ฐ์‚ฐ์ž์—๋‹ค๊ฐ€ noexcept๋ฅผ ๋ถ™์ด๊ณ , ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

    ํŠนํžˆ c++์˜ stl์—์„œ๋Š” ์œ„์˜ ๊ฐœ๋…์ด ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

noexcept๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์‹ค์ œ ์ฝ”๋“œ 240803

vector์˜ ๊ฒฝ์šฐ, ์œ ์ €์ •์˜ ํด๋ž˜์Šค์—์„œ์˜ ์ด๋™์ƒ์„ฑ์ž์™€ ์ด๋™ ๋Œ€์ž…์— noexcept ์ž‘์„ฑ๋˜์ง€ ์•Š์œผ๋ฉด, ์ด๋™ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋Š”
vector v(2);
v.resize(4); ๋ฅผ ํ•˜๋ฉด move ์—ฐ์‚ฐ์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, copy๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์„
ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

is_nothrow_move_constructible
: ํด๋ž˜์Šค์˜ ์ด๋™์ƒ์„ฑ์ž์—์„œ ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ๋ฉด, true / ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

move_if_noexcept(Object)
: ๊ฐ์ฒด๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ๋ฉด, ๋ณต์‚ฌ๋ฅผ ํ˜ธ์ถœ,
๊ฐ์ฒด๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ์—†์œผ๋ฉด ์ด๋™์„ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๋Š” ํ‚ค์›Œ๋“œ

  • ํ˜„์žฌ ๋งŒ๋“  ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ, ์˜ˆ์™ธ๊ฐ€ ์—†๋‹ค๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด๋กœ ์ธํ•ด
    c++์—์„œ๋Š” ์˜ˆ์™ธ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ผ๊ณ  ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
    move_if_noexcept์—์„œ ๋ณต์‚ฌ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

์ด๋™์ƒ์„ฑ์ž์™€ ์ด๋™ ๋Œ€์ž…์—ฐ์‚ฐ์ž์— noexcept๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ์ด์œ 

- ์ด๋™์ƒ์„ฑ์ž๋‚˜ ์ด๋™๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ, ํฌ์ธํ„ฐ๊ฐ„์˜ ๋ณต์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ํฌ์ธํ„ฐ์˜ ๋ณต์‚ฌ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, 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๊ฐ€ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

profile
๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€