質問

だから私はPIMPLとスタック割り当てについて考えていました。私はライブラリを書いていて、PIMPLを使ってクラスのプライベートメンバーを隠すことを決定しました。つまり、この

のように宣言されたクラスがあることを意味します。
class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};
.

それはかなり前進します。しかし、その後コンストラクタでこの

を実行します
Foo::Foo() : handle(new Handle()) {}
.

だから私のライブラリを使用している誰かがスタックにfooを作成すると、とにかく本質的にヒープ割り当てが行われています。これはあなたがpimplを使用するときに住む必要があるトレードオフですか?コンストラクターの横にある警告を使用してドキュメントを解放することを考えていました。

私の他の考えは、純粋な仮想インターフェイスとして実装にさらされているすべてのクラスと、スマートポインタを返す静的ファクトリメソッドの全体の束を持つことでした。これはヒープ割り当ても意味しますが、それにトリックはありません。

何も考えや提案?私は私のライブラリを使ってプログラマーを過度に考慮されていますか?

役に立ちましたか?

解決

これは、PIMPLを使用するときに住む必要があるトレードオフですか?

事実上、はい、>高速PIMPL IDIOM、「ヒープ割り当てを除去またはスピードアップするために使用することができます。

コンストラクターの横にある警告を使用して文書を解放することを考えていました:「警告:これはヒープ割り当てになります」またはsomesuch。

それがそうする必要がある場合にのみ(すなわち、クラスがヒープ割り当てを実行したという事実に驚いている場合にのみ)。多くのクラスは、C ++標準ライブラリ(たとえば、コンテナなど)の多くを含むヒープ割り当てを実行します。

私は私のライブラリを使ってプログラマーを過度に考慮されていますか?

おそらく:-)。あなたがあなたのクラスのための高性能要件を持っていない限り、あなたのクラスのインスタンスを頻繁に頻繁に作成および破壊することを期待しない限り、私はそれについてあまり心配しないでしょう。もちろん、あなたが大きなパフォーマンス要件を持っているならば、PIMPLは良い選択ではないかもしれません。

他のヒント

だから私のライブラリを使用している誰かがスタックにfooを作成すると、とにかく本質的にヒープ割り当てが行われています。これはあなたがpimplを使用するときに住む必要があるトレードオフですか?

Yep。

コンストラクターの横にある警告を使用して文書を解放することを考えていました:「警告:これはヒープ割り当てになります」またはsomesuch。

積極的なコメントを想定していると思います:)あなたのクラスがそのようなパフォーマンスが重要であるならば、おそらくあなたはPIMPLイディオムを避けるべきです。あなたが数字を表しているならば、これは注意を払っているかもしれません。データベース接続の実装を非表示にしている場合は、コメントの価値がない:)

私の他の考えは、純粋な仮想インターフェイスとして実装にさらされているすべてのクラスと、スマートポインタを返す静的ファクトリメソッドの全体の束を持つことでした。これはヒープ割り当ても意味しますが、それにトリックはありません。

ええ、それはユーザーにもう少し明白ですが、またおそらく自分自身に関しては価値がないでしょう。

何も考えや提案?私は私のライブラリを使ってプログラマーを過度に考慮されていますか?

トレードオフがありますが、あなたのクラスがPIMPLイディオムから本当にゲインするのに十分複雑であるならば、あなたはおそらくヒープ割り当てがOKであると仮定することができます。私があなたのライブラリを使っていたら、それはおそらく私には関係ありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top