본문 바로가기

개발/C++

C++ shared_ptr 사용할 때 주의할 점

 

shared_ptr로 생성한 변수를 다른 함수의 매개변수로 넘길 때 신경 써야 할 부분이 있음

 

#include "pch.h"
#include <iostream>
#include <thread>
#include <Windows.h>
#include <chrono>

void Func(std::shared_ptr<int> shared)
{
	//std::cout << *shared << std::endl;
}

void RefFunc(std::shared_ptr<int>& shared)
{
	//std::cout << *shared << std::endl;
}

int main()
{
	std::shared_ptr<int> shared = std::make_shared<int>(3);

	auto time = std::chrono::high_resolution_clock::now();
	for (int i = 0; i < 10000000; i++)
	{
		Func(shared);
	}
	std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time).count() << std::endl;

	time = std::chrono::high_resolution_clock::now();
	for (int i = 0; i < 10000000; i++)
	{
		RefFunc(shared);
	}
	std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - time).count() << std::endl;
}

 

결과

 

그냥 넘길 때와 참조로 넘길 때 차이가 큰 것을 볼 수 있음

 

shared_ptr를 Func에 넘길 때 참조 카운트가 1 오름

 

참조형으로 넘길 때는 오르지 않음

 

shared_ptr의 참조 카운트가 오를 때 interlocked 하기 때문에 멀티스레드에서도 안전하지만 여러 번 부르면 느려질 수 있음..

 

사실 저렇게 쓸 일이 많은지는 모르겠음

'개발 > C++' 카테고리의 다른 글

C++ 머지 소트(병합 정렬) 구현해보기  (0) 2019.06.21
C++ const 키워드  (0) 2019.06.09
컴파일러 최적화  (0) 2019.05.13
C++ 스마트 포인터  (0) 2019.05.07
C++ Map, HashMap(unorder_map) 사용할 때 주의할 점  (0) 2019.04.27