2012-07-12 2 views
1

가능한 중복 :
Should I pass a shared_ptr by reference?
Passing smart pointers as arguments함수에 std :: shared_ptr <Resource>을 전달하는 방법은 무엇입니까?

내가 값 또는 상수 참조하여 통과해야 하는가? 값으로 또는 지속적인 참조에 의해 복사 가능한 객체를 전달할 것인지에 대한 많은 경험을 읽었습니다. 예를 들면 :

  1. 통과 일정한 기준에 의해 목적 및 (함수 객체 제외) 값 유형에 내장 (동적 메모리를 포함하는) 객체의 크기가 더블 미만 2 *의 크기가 아닌 값에 의해
  2. 패스 .

이 규칙이 std::shared_ptr<Resource>에 어떻게 적용되는지 설명해 주시겠습니까? 나는 그 물체가 아마도 매우 작고, 아마도 포인터와 참조 카운터 일지 모르지만 그것은 여전히 ​​대상이라는 것을 이해한다. 가장 좋은 방법은 무엇입니까?

+0

Ahh, 예, 죄송합니다, 저의 경우 –

+2

내 규칙은 : 참조 의미를 원할 때 참조로 전달하고 값 의미를 원할 때 값으로 전달하십시오. 나는 그들이 당신이 읽었던 사람들보다 우월하다고 생각합니다. (그들은 암기하기도 더 쉽습니다 : P) –

+0

@RMartinhoFernandes : 어떻게 const 참조가 그걸 나타낼까요? 필자가 종종 읽는 엄지 손가락 규칙은 본질적으로 값의 의미에 관심이있는 경우에 const 참조를 전달하는 것이고 (객체를 변경하지 않고 객체를 쿼리하는 것을 의미 함) 참조 시맨틱이 아니라는 점을 제안합니다 (여기서 객체를 수정할 수있는 기능을 원합니다). 또는) 그냥 동역학을 말하고 있었습니까? "참조를 원할 때 참조로 전달하고 값을 원할 때 값으로 전달"? – Managu

답변

0

아마도 성능과 관련하여 가장 중요한 관심사는 값으로 전달할 때 발생하는 것과 같이 std::shared_ptr<...> 사본을 만드는 것이 참조 횟수를 연동하여 증가시켜야한다는 것입니다. 또는 구현에 따라 중요한 섹션과 같은 다른 형태의 동기화가 가능합니다. 이러한 비용은 다중 스레드 프로그램에서 중요 할 수 있습니다.

참조로 전달하는 것이 더 나은 선택입니다. 그것은 단점입니다 (또는 boost::shared_ptr<...> 만 해당)? shared_ptr<...>은 표준 스레드 안전 보장 만 제공합니다. 모든 액세스가 const 메서드에만있는 경우가 아니면 단일 shared_ptr<...>에 대한 액세스를 보호해야합니다 (예 : 뮤텍스). 다중 스레드 상황에서 shared_ptr<...>에 대한 const 참조를 전달하면 적절한 동기화를 보장하기가 더 어려워 질 수 있습니다.

단일 스레드 프로그램에서는 많은 차이를 내지 않을 것입니다.

+0

나는 이것이 가장 중요한 우려라고 완전히 반대합니다. 가장 중요한 관심사는 올바른 프로그램, 즉 소유권을 공유할지 여부를 결정해야합니다. –

+0

@RMartinhoFernandes : 좋은 지적입니다. 나는 "성과와 관련하여 가장 중요한 관심사"를 의미한다고 생각합니다. 비록 내가 아마 "대답해야합니다"당신의 친절한 프로파일 러에게 성능에 대해 물어보십시오." – Managu

+0

어쨌든, 잠재적으로 자물쇠가없는 작업 대신에 동기화를 얻을 수 있기 때문에 (누군가가 스마트 포인터에 대한 참조를 원하는 이유를 제외하고) 참조로 전달하는 것으로 논쟁하는 것처럼 보입니다. –

관련 문제