2012-01-28 7 views

答えて

4

差は、オブジェクトのメモリレイアウトである:例えば、次のコードでのpthreadとスレッドの違いは何です。

メンバアイテムは構造体のように格納されます - メモリに連続して連続的に格納されます(おそらく2-4-8バイトのアラインメントがありますが、それ以外は順番に1つずつ順番に格納されます)。ポインタはメモリアドレスに4/8バイトのポインタとして格納され、実際のオブジェクトはメモリ内のどこにでも格納できます。

は、あなたが構造を持っている状況

struct grades { 
    unsigned char math; 
    unsigned char english; 
    unsigned char history; 
    unsigned char physics; 
    unsigned char chemistry; 
    unsigned char biology; 
    unsigned char computers; 
}; 

は、構造体のサイズは7バイトです。考えてみましょう

class Student_member { 
    unsigned long id; 
    struct grades _grades; 
}; 

とクラスStudent_pointer:

class Student_pointer { 
    unsigned long id; 
    struct grades *_grades; 
}; 

次にクラスStudent_memberのメモリ内のサイズは4 + 7 = 11バイトになります(長い今、あなたはクラスStudent_memberを持っている場合

Student_pointerクラスのメモリ内のサイズは、4 + 4 = 8バイト(long + pointer)であり、実際の等級を格納するメモリ内の他のどこかに割り当てられた別の7バイトである。

+0

また、どのようにアクセスされていますか?しかし、大きな問題はレイアウトです。 –

1

メンバーポインタがある場合、メンバーが指すオブジェクトは、それを指すオブジェクトのライフサイクルによっては生きていません。ポインタが指すオブジェクトはNULLにすることができます。必要なときにインスタンスを作成し、不要になったときにインスタンスを削除する(削除を介して)必要があります。

(ポインタではなく)メンバーインスタンスがある場合、インスタンスは親のコンストラクタが実行されるときに作成され、親のデストラクタが実行されると破棄されます。

ポインタを介してオブジェクトを持っている場合、そのオブジェクトは他のいくつかのオブジェクト間で共有される可能性があるため、ポインタを保持するオブジェクトは必ずしもポイントオブジェクトを制御するオブジェクトではありません。

1

ポインタは、何かを割り当てたメモリのアドレスの名前です。したがって、固定サイズ(例えばIntel x86アーキテクチャでは32ビット)です。 これは、Aオブジェクトが作成されたときに、が有効に存在するメモリのアドレスを格納するために、pThreadフィールドが常にその32ビットを占有することを意味します。

あなたは、ポインタを使用しない場合は、boost::threadAオブジェクトの一部としてその全体上に作成されますので、Aオブジェクトが作成されるときには、スタック内のboost::threadとして大きなとしてのストレージを占有します。

ポインターの管理はポインタ以外の変数を使用するよりも複雑になる可能性があります。誰かがboost::threadのメモリを割り当て(割り当てを解除する)必要があるため、ポインタは有効なアドレスを指し、メモリリークは発生しません。

+0

実際、私はポインタと値の違いを知っています、私の質問はこれで不明でした:) – Erik

関連する問題