์ต๊ทผ '์ด๊ฒ์ด C++์ด๋ค.'๋ฅผ ๊ณต๋ถํ๊ณ ์๋๋ฐ '4์ฅ ๋ณต์ฌ ์์ฑ์์ ์์ ๊ฐ์ฒด' ํํธ์์ ์๋ ์๊ฐํ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ ์ฑ ๊ณผ ๋ฌ๋ผ ๊ตฌ๊ธ์ ํตํด ์ฌ๋ฌ ๋ธ๋ก๊ทธ, ์ ํ๋ธ๋ฅผ ๋ณด๋ฉด์ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ ์ ์ ๊ฐ์ ๊ณ ๋ฏผ์ผ๋ก ํ๋ ๋ถ๋ค์ ์ํด ์ ์๊ฐ๋ ์ ๋ฆฌํ ๊ฒธ ๊ธ์ ์จ๋ด ๋๋ค. ์ ๋ ๋งฅ OS์์ Xcode๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ฉํ์์ต๋๋ค.
* ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
#include <iostream>
using namespace std;
class CTestData{
public :
CTestData() {
cout<<"CTestData()"<<endl;
}
~CTestData(){
cout<<"~CTestData() : "<<endl;
}
CTestData(CTestData &rhs)
: m_nData(rhs.m_nData)
{
cout<<"CTestData(CTestData &)"<<endl;
}
CTestData(CTestData &&rhs)
: m_nData(rhs.m_nData)
{
cout<<"CTestData(CTestData &&)"<<endl;
}
CTestData& operator=(const CTestData &) = default;
int GetData() const {return m_nData;}
void SetData(int nParam){m_nData = nParam;}
private :
int m_nData = 0;
};
CTestData TestFunc(int nParam){
cout<<"**TestFunc() Begin***"<<endl;
CTestData a;
a.SetData(nParam);
cout<<"**TestFunc() End***"<<endl;
return a;
}
int main(){
CTestData b;
cout<<"*Before*****"<<endl;
b = TestFunc(20);
cout<<"*After*****"<<endl;
CTestData c(b);
return 0;
}
CTestData()
*Before*****
**TestFunc() Begin***
CTestData()
**TestFunc() End***
CTestData(CTestData &&)
~CTestData()
~CTestData()
*After*****
CTestData(CTestData &)
~CTestData()
~CTestData()
์ฑ ์์๋ ์์ ์คํ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๊ณ ์ ํ์์ต๋๋ค. ํ์ง๋ง, ์ ๊ฐ ์คํ์์ผฐ์ ๊ฒฝ์ฐ์๋ ์๋ ์คํ๊ฒฐ๊ณผ๊ฐ ๋์์ต๋๋ค.
CTestData()
*Before*****
**TestFunc() Begin***
CTestData()
**TestFunc() End***
~CTestData()
*After*****
CTestData(CTestData &)
~CTestData()
~CTestData()
์ ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋์ง ์์์๊น์?
์ผ๋จ, ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋๋ ์์น๋ถํฐ ์์๋ด
์๋ค. ์ฑ
์์๋ TestFunc์์ return a;๋ฅผ ํ๋ ์๊ฐ ์ปดํ์ผ๋ฌ์์ ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ์ ๋์์ ์์ ๊ฐ์ฒด์ ์ด๋ ์์ฑ์๋ฅผ ํธ์ถํ๋ค๊ณ ๋งํฉ๋๋ค. ์ ๋ ์ฒ์์ b = TestFunc(20); ์ฝ๋์์ ์์ ๊ฐ์ฒด๊ฐ b ๊ฐ์ฒด๋ก ๋์
๋ ๋ ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋๋ ๊ฒ์ผ๋ก ์ฐฉ๊ฐํ์์ต๋๋ค. ํ์ง๋ง, ์๊ฐํด๋ณด๋ฉด ๋น์ฐํ ๋ง์ด ์๋๋ ๊ฒ ์ด๋ฏธ b ๊ฐ์ฒด๋ ์์์ ์ ์ธํ์์ผ๋ ์ด๋ฏธ ์ด ๊ฐ์ฒด๋ ๋ํดํธ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ์์ฑ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌํผ, ๊ทธ๋ผ ์ด์ ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋๋ ์์น๋ฅผ ์์์ผ๋ ์ ์๋ต๋์๋์ง๋ฅผ ์์์ผ๊ฒ ์ฃ . ์ด๋ ๊ตฌ๊ธ ๊ฒ์์ ํตํด ์๊ฒ๋์๋๋ฐ, '๋ณต์ฌ ์๋ต copy elision'์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ๋ณต์ฌ ์๋ต์ ์ปดํ์ผ๋ฌ์์ ์์์ ํ๋ ์ต์ ํ ๊ธฐ๋ฅ์
๋๋ค.
์์ ์ฝ๋์์ TestFunc ํจ์๋ฅผ ๋ณด๋ฉด ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ returnํ๊ณ ์์ง์? ์๋๋ผ๋ฉด ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ณต์ฌ ํน์ ์ด๋ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ง์ง๋ง, ์ปดํ์ผ๋ฌ๊ฐ ํ๋จํ๊ธฐ์ ํ์์๋ ์ฐ์ฐ์ด๋ผ ์๊ฐํ์ฌ NRVO(Named Retrun Value Optimization) ๋ณต์ฌ ์๋ต์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด, ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ทธ๋ฅ a ๊ฐ์ฒด ์์ฒด๋ฅผ return ํด๋ฒ๋ฆฝ๋๋ค.
๊ทธ๋์ ๋ณต์ฌ ํน์ ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋์ง ์์๋ ๊ฒ์
๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ณต์ฌ ์๋ต ์ต์ ํ๋ฅผ ๋๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๋ค์์ฒ๋ผ main ํจ์๊ฐ ์์นํ cpp ํ์ผ์ ๋๋ธํด๋ฆญํ์ฌ `-fno-elide-constructors` ๋ฌธ๊ตฌ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ํน์ b = TestFunc(20); ์ฝ๋๋ฅผ `b = std::move(TestFunc(20));` ์ผ๋ก ๋ฐ๊ฟ์ค๋ ๋๊ฐ์ด ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋ฉ๋๋ค. std::move๋ ์๋์ ์ผ๋ก ์ด๋ ์์ฑ์๋ฅผ ํธ์ถ์์ผ์ฃผ๋ ํจ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์ฌํผ ์ด๋ก์จ ์ฑ
๊ณผ ๊ฐ์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณต์ฌ ์์ฑ์์ ์ด๋ ์์ฑ์ ๊ด๋ จํ์ฌ ์ด ์ ํ๋ฒ ์์์์ ๋์์ ๋ง์ด ๋ฐ์์ต๋๋ค.
'๊ฒ์๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BSP ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ๋๋ค ๋งต ์์ฑ ใ ก๋ก๊ทธ๋ผ์ดํฌ (0) | 2023.08.07 |
---|---|
๋ก๊ทธ๋ผ์ดํฌ ๋งต ์์ฑ ๋ฐฉ์ (0) | 2023.07.26 |
[1] ํฌ๋กฌ ๋ค์ด๋ ธ ๊ฒ์ - ๋ฐฐ๊ฒฝ, ์บ๋ฆญํฐ ๋ง๋ค๊ธฐ (0) | 2023.07.23 |
[0] ํฌ๋กฌ ๋ค์ด๋ ธ ๊ฒ์ (T-Rex ๊ฒ์) (0) | 2023.07.23 |