1

私は数時間かけて、いくつかの優れた C++ の本とスタック オーバーフローに関する議論を探しました。「ヒープ vs スタック」の質問に関してかなりの数の質問を見てきましたが、より具体的に調べています。クラスのオブジェクトメンバーを作成する際のポインターの使用または非構成の理解。

例えば:

class A{
B c;
}

対。

class A{
B*c;
}

最初の例では、これは実際には「スタック」割り当てではなく、「静的ストレージ領域」での割り当てであり、これは別のものであるため、スタックとヒープの議論は当てはまらないと思います。

私には明らかではないのは、どちらの長所と短所です。私が読んだほとんどのコードは 2 番目のオプションを使用しているようですが、なぜですか?

このサイトを適切に検索するためのこれらの手法の適切な用語を私が知らない可能性があります。そうでなければ、これに関する質問がなかっただけです。実際にこれに関する回答が他の場所にある場合は、ぜひそれらを見つける方法を教えてください。しかし、ほとんどすべてがローカル変数のコンテキストでのスタックとヒープに関するものであるように思われ、私はそれをうまく処理していると思います.

4

2 に答える 2

1

人々が 2 番目のオプションを使用する理由は次のとおりです。

class A { B b;}; // error, order of classes wrong
class B { }; 

C++ のこの単純な機能により、B b を使用して動作するシステムを構築することが困難になります。スタイル。関連するすべてのクラスを同じファイルに配置し、クラスを正確に正しい順序に並べ替える必要があります。

また、継承も順序でいくつかの魔法を行います。

class A : public B { }; // error, order of classes wrong
class B { };

したがって、継承と B b; を使用します。一緒にクラスの順序を完全に修正しているため、多数のデータメンバーは悪夢になります。(float や int などの型には順序の問題がないことに注意してください。また、クラスに対しても正しく行うことができます)

于 2013-02-02T09:09:16.870 に答える
0

オブジェクトへのポインターをクラスのメンバーとして持つもう 1 つの理由は、ポインターが実際に何かを指す必要があり、指すオブジェクトを頻繁に変更したい場合です。たとえば、あるシステムまたはフレームワークでアクティブなウィンドウへのポインタを保持するクラスを想像してみてください (完全に架空のものです)。以下で指しているオブジェクトのメモリはactiveWindow別の場所に割り当てられ、指しているオブジェクト自体が頻繁に変更されます。

class Monitor
{
...
Window* activeWindow
...
}

一方、すべてのポインターを持ち、new演算子 (またはmalloc()C) を使用して手動でメモリを割り当てると、ヒープ上のメモリの割り当てはスタック上のメモリよりも遅くなり、後で手動で解放する必要があるため、遅くなる傾向があります。したがって、可能であれば避けるべきです。

オブジェクトをクラスのストレージ領域に配置することをやめて、ヒープに割り当てることができない場合は、そうしてください。

class foo
{
B c;
};

よりも確かに優れています

class foo
{
public:
 foo()
 {
   this->c = new B();
 }
 ~foo()
 {
   delete this->c;
 }

private:
B* c
};

しかし、それはすべての性質に依存しますclass B

于 2013-02-02T09:29:09.090 に答える