(C++ : Perfect-Forwarding-5) emplace_back, make_shared 사용이유

Posted by : at

Category : Cpp


#include <iostream>
#include <vector>
using namespace std;

class Point
{
    int x, y;
public:
    Point(int a, int b) { cout << "Point()" << endl; }
    ~Point() { cout << "~Point()" << endl; }
    Point(const Point&)
    {
        cout << "Point(const Point&)" << endl;
    }
};

int main()
{
    vector<Point> v;

    Point p(1, 2);
    v.push_back(p);

    // 소멸자가 몇번 호출될까?
    // 2회 호출된다 -> p가 생성되며 한 번 vecotr에 할당되며 한 번 총 2회

    // 이렇게 만들어지면 역시 오버헤드이다.

    // 해결책은?
}
int main()
{
    vector<Point> v;

    v.emplace_back(1, 2);
    // 소멸자 호출 횟수 : 1
    // vector에 객체를 넣을때 push_back보다 emplace_back을 이용하자!
}

그런데 emplace_backperfact forwarding과 무슨상관인가?

int main()
{
    vector<Point> v;

    int n = 20;
    v.emplace_back(1, 2, n);
    // n을 perfact forwarding으로 전달해 준다(STL에 그렇게 구현이 되어 있음.)
}
// 또 다른 예제
#include <iostream>
#include <memory>
using namespace std;

class Point
{
    int x, y;
public:
    Point(int a, int b) { cout << "Point()" << endl; }
    ~Point() { cout << "~Point()" << endl; }
    Point(const Point&)
    {
        cout << "Point(const Point&)" << endl;
    }
};

int main()
{
    // 메모리 할당은 몇 번 될까?
    shared_ptr<Point> sp( new Point(1, 2) );
    // 총 2개의 메모리에 할당이 된다.
    // Point를 위한 메모리
    // 포인터 객체관리를 위한 메모리
    // 그런데 이런 할당은 메모리 파편화로 인한 성능 저하의 원인이 된다.

    // 해결법은 없나?
}
shared_ptr<Point> sp = make_shared<Point>(1, 2);
// 객체와 포인트 객체 관리 메모리를 함께 생성해 달라

// 이 make_shared도 perfect forwarding으로 구성된다.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links