2009-04-13 12 views
4

申し訳ありませんが、質問が明確でない場合。 1つの文章で説明するのはかなり難しいと感じました。struct定義のstructへのポインタを使う価値はいつですか?

私はstructのメンバーで、structです。次のようになります。

struct A { 
    struct B b; 
}; 

私は、この構造体のインスタンスが常にヒープ割り当てされると考えています。これに変更することで得られるものはありますか?私はメモリの割り当てと割り当て解除の世話をすることになるようなmake_Afree_Aとして機能するのカップルがbによって指される必要があるだろう後者の場合(すなわちstruct Bポインタを維持)

struct A { 
    struct B *b; 
}; 

;

第2の形式が好ましいと思われる唯一の例は、struct Aのすべてのインスタンスが実際にbを使用するとは限りません。その場合、メモリを必要とするインスタンスに余分なメモリを割り当てるだけで、メモリを節約できます。

2番目のフォームが有用な場合はありますか?

答えて

7

すべてのAは正確に一つのBを持つことになります場合は、Bへのポインタを使用しないでください。

余分なメモリ管理を気にする必要はありませんが、実際には遅く、効率が悪く、Bを割り当てることができません。

Bへのポインタを他のコードに渡したい場合でも、そのアドレスを渡すことはできます。

+0

+1複雑度の低い管理 – ojblass

5

Aの複数のインスタンスがBのインスタンスを共有できるときは、Bへのポインタを持つことで得られます。複数のバージョンでBのバージョンの重複やバージョンの維持を避けるのに役立ちます。ジョナサンのコメントによれば、これはメモリを解放し、Bへの参照を取り除くことを犠牲にして行われます。

+0

Bへのポインタを所有している人の履歴を保持するか、または与えられたBを解放することができます。 C++用語での参照カウント。 –

3

あなたはあなたの最後の声明で頭に釘を打つと思います。 AのすべてにBが含まれていない場合は、ポインタを使用してメモリを節約できます(AにはBが含まれていない場合はnull)。

未使用のすべての累積サイズが利用可能なヒープのかなりの割合でない限り、これは実際には有用ではありません。

しかし、次の理由「AのないすべてのインスタンスがBの正確に一つのコピーを持っているだろうと、」私が読んで、あなたの文を変更します(これはあなたが求めている他のケースである):

ここで、Bはリスト内のノードです(これはまた別のBまたはnullへのポインタを保持しています)、ポインタにします[の場合はの場合すべてAに少なくとも1つが必要ですB ]。

その性質がそれを許可した場合、他の可能性が Aの間 B Sを共有している

あなたが、その場合にはB Sを参照カウントする必要があると思いますけれども、(スクリーンB上のウィンドウであるAなど)あなたのコールでいつそれらを解放するかを知ることができます(そして、あなたのmake_A()コールで既に存在するBを再利用できることはもちろんです)。

関連する問題