2011-01-30 4 views
0

私たちはクラスのオブジェクトを宣言?連続のメモリレイアウト(次々)です?メモリの概念に私を助けてください。クラスのレイアウトクラスのメモリレイアウトは連続していますか?よりその連続が(構造体のパディングのような)ことで発生</strong><strong>パディングを行う場合

ありがとうございます。

+0

あなたのタイトルと質問を言い換えることができます。 * "memory allocation" *というフレーズを使用する代わりに、* "memory layout" *を使用してください。 – Nawaz

答えて

7

クラスのオブジェクトが のメモリ割り当てを連続して宣言するとき(1つ後に )?

この規格では、このような保証はありません。オブジェクトメモリのレイアウトは実装定義です。

通常、データメンバのメモリアドレスは、クラスで定義されている順に増加します。しかし、この指定はアクセス指定子(privateprotectedpublic)が発生した場所では中断される可能性があります。これは、Inside the C++ Object ModelによってLippmanで詳細に議論されている。

C/C++ Users Journalからの抜粋、

コンパイラはいえ、この 再配置自体を行うことを許可されていません。 標準では、 のと同じ public :, protected :,または private:はコンパイラによって オーダーにレイアウトされている必要があります。あなたがアクセス 指定子を使用してデータをまき散らす 場合は、しかし、コンパイラが ある、レイアウトを向上させるために データの アクセス指定子区切りブロックを再配置することができ である理由のアクセス を置くような一部の人指定されたすべてのデータの前に メンバー

面白いですね。

+0

私はこれが信じがたいと思います。それが本当であれば、2つのコンパイラのコードはどのように相互作用しますか? –

+4

@David:そうではありません。実際には、コンパイラ間の相互運用性を得る唯一の方法は、普通の古いCに固執することです。 – Tomek

+0

@Tomek:ほとんどの開発者は特定のプラットフォームのほとんどの開発者が同じコンパイラ(または同じコンパイラ、異なるバージョン)を使用するので、通常は駄目です。ほとんどのWindows開発者はVC++を使用しています。ほとんどの* NIX開発者はGCCなどを使用しています。 –

関連する問題