3

私は現在、C++オブジェクトモデルの内部を読んでいます。9ページには、クラスのコンテンツがメモリ内にどのように配置されるかを示す図があります。これは、クラスメモリに実際に存在するオブジェクトの唯一の部分が非静的データメンバーであると述べています。

プログラムのメモリの内容に関するSOからの投稿は次のとおりです。

スタックまたはヒープ内のC++でのグローバルメモリ管理?

2番目の回答では、プログラムのメモリレイアウトについて詳しく説明し、スタックとヒープを示しています。

静的データメンバー/クラス関数(基本的に、オブジェクト内に格納されていないクラスの部分-9ページを参照)の場所は、オブジェクトがスタックにあるかヒープにあるかによって変わりますか?

4

2 に答える 2

4

静的データメンバーは、グローバル変数およびプレーン静的変数が存在するのと同じメモリ領域に存在します。これは、クラスのインスタンスがどのように作成されたかに応じて、スタックまたはヒープのいずれかに存在する可能性のある「クラスメモリ」です。

静的データメンバーは、グローバル変数とそれほど違いはありません。ただし、スコープはクラス名であり、名前によるアクセスは、、、およびを介して制御publicできprivateますprotectedpublicすべての人にアクセスを提供します。privateクラスのメンバーのみにアクセスを制限しますがprotectedprivate静的データメンバーを持つクラスから継承するクラスへのアクセスを拡張します。

対照的に、グローバル変数には誰でも名前でアクセスできます。プレーンな静的変数には、同じソースファイル内のコードによって名前でアクセスできます。

プレーンクラスメソッドは、実際には単なる通常の関数(モジュロアクセス制御)ですが、暗黙のthisパラメーターがあります。クラス内のスペースを占有しません。ただし、virtualクラスメソッドは、派生クラスのメソッドの実装に解決する必要があるため、クラス内のメモリを占有します。しかし、あなたが教科書のどこにいるかについては、ポリモーフィズムはまだカバーされていない可能性があります。

于 2012-07-01T16:52:47.507 に答える
2

いいえ、変数が割り当てられる場所は、静的データまたはコードのストレージには影響しません。これらは通常、スタックでもヒープでもない別々のメモリ領域に格納されます。

関数と静的データメンバーは、プログラム全体にそれぞれのコピーが1つしかないという点で特別です。

クラスまたはその他のタイプの変数は、ほとんどの場合、プログラムの実行中に複数回作成および破棄されます。

于 2012-07-01T16:53:23.713 に答える