문제

PIMPL 및 스택 할당에 대해 생각해 왔습니다.나는 라이브러리를 작성하고 PIMPL을 사용하여 클래스의 개인 구성원을 숨기기로 결정했습니다.즉, 나는 이것을 이렇게 선언 한 수업을 이루는 것을 의미합니다

class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};
.

꽤 똑바로 앞으로 나옵니다.그러나 그런 다음 생성자 에서이 작업을 수행합니다

Foo::Foo() : handle(new Handle()) {}
.

이 라이브러리를 사용하는 사람이 스택에 Foo를 만드는 경우 본질적으로 어쨌든 힙 할당을 수행합니다.이것은 PIMPL을 사용할 때와 함께 살아야 할 트레이드 오프입니까?나는 문서를 생성자 옆에있는 경고로 해제 할 것으로 생각했습니다. "경고 :이 결과는 힙 할당이 생성됩니다."

내 다른 생각은 Smart 가상 인터페이스로서의 구현에 노출 된 모든 수업이 있고 스마트 포인터를 반환하는 정적 공장 방법 전체의 뭉치를 갖는 것이 었습니다.이것은 또한 힙 할당을 의미하지만 그것에 속임수가 없습니다.

어떤 생각이나 제안이 있습니까?내 도서관을 사용하는 프로그래머가 지나치게 사려 깊고 있습니까?

도움이 되었습니까?

해결책

은 PIMPL을 사용할 때와 함께 살아야 할 트레이드 오프입니다.

효과적으로, 예, in hreb sutter가 논의하는 것과 같은 기술이 있습니다. 빠른 PIMPL 관용구, "힙 할당을 제거하거나 가속화하는 데 사용할 수있는 힙 할당 비용으로

나는 문서를 생성자 옆에있는 경고로 해제 할 생각을 생각했습니다. "경고 : 힙 할당이 생성됩니다."또는 somesuch.

즉, 그렇게 할 필요가있는 경우에만 (즉, 사용자가 클래스가 힙 할당을 수행한다는 사실에 놀라지 만있을 경우에만). 많은 클래스는 C ++ 표준 라이브러리 (예 : 모든 컨테이너)의 많은 부분을 포함하여 힙 할당을 수행합니다.

내 도서관을 사용하여 프로그래머가 지나치게 사려 깊고 있습니까?

가능합니다 :-). 수업에 대한 높은 성능 요구 사항이 없거나 수업의 인스턴스가 매우 자주 생성되고 파괴 될 것이라고 기대하지 않는 한, 나는 그것에 대해 너무 걱정하지 않을 것입니다. 물론, 당신이 상당한 성능 요구 사항을 가지고 있다면, PIMPL은 좋은 선택이 아닐 수도 있습니다.

다른 팁

이 라이브러리를 사용하는 사람이 스택에 Foo를 만드는 경우 본질적으로 어쨌든 힙 할당을 수행합니다. 이것은 PIMPL을 사용할 때와 함께 살아야 할 트레이드 오프입니까?

옙.

나는 문서를 생성자 옆에있는 경고로 해제 할 생각을 생각했습니다. "경고 : 힙 할당이 생성됩니다."또는 somesuch.

나는 공격적인 논평을 통해 그것을 고려할 것입니다 :) 수업이 성능이 중요한 경우, 아마도 PIMPL 관용구를 피해야합니다. 숫자를 대표하는 경우 이것은 관습적이고 주목할 가치가있을 수 있습니다. 데이터베이스 연결의 구현을 숨기고있는 경우 주석의 가치가 없습니다.)

내 다른 생각은 Smart 가상 인터페이스로서의 구현에 노출 된 모든 수업이 있고 스마트 포인터를 반환하는 정적 공장 방법 전체의 뭉치를 갖는 것이 었습니다. 이것은 또한 힙 할당을 의미하지만 그것에 속임수가 없습니다.

예, 그것은 사용자에게 조금 더 분명하지만, 아마도 자신의 가치가있는 가치가 없을 것입니다.

어떤 생각이나 제안이 있습니까? 내 도서관을 사용하는 프로그래머가 지나치게 사려 깊고 있습니까?

트레이드 오프가 있지만 클래스가 PIMPL 관용구에서 실제로 얻을 수있을 정도로 복잡하다면 힙 할당이 괜찮을 것으로 가정 할 수 있습니다. 내가 당신의 도서관을 사용하고 있다면, 아마도 나를 염려하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top