4

制御構造のブロック内で変数を定義した場合、それはその制御構造のブロックの実行にのみ存在し、囲んでいる関数の実行全体には存在しませんか?

また、プログラムの正確なメモリ使用量とその変更(つまり、変数の作成と破棄によるメモリ使用量の変更)を監視するにはどうすればよいですか?

後で追加:次のコードでは、vスコープがifブロックであることを知っていますが、vがメモリ内でifブロックの開始/終了時に作成/破棄されるのか、関数funcの開始/終了時に作成/破棄されるのかを知りたいですか?

void func ()
{
    if (true)
    {
        int v;//automatic storage class
        v = 1;
    }
}
4

3 に答える 3

2

制御構造のブロック内で変数を定義した場合、それはその制御構造のブロックの実行にのみ存在し、囲んでいる関数の実行全体には存在しませんか?

変数を定義せずに宣言する場所によって異なります。

変数には、宣言したスコープでのみアクセスできます。明示的に渡すと、スコープを超えてアクセスできますが、有効なままであるかどうかは、変数のストレージタイプによって異なります。
たとえばstatic、変数はプログラムの存続期間を通じて存続し
ますが、関数から自動変数のアドレスを返すと、関数が戻った後も変数が有効なままにならないため、未定義動作になります。

良い読み物: 定義と宣言の違いは何ですか?

プログラムの正確なメモリ使用量とその変更(つまり、変数の作成と破棄によるメモリ使用量の変更)を監視するにはどうすればよいですか?

自動オブジェクトはスコープ内で十分な長さしか存続しないため、動的に割り当てられたオブジェクトに関する情報を取得する必要があると思います。自動オブジェクトは自動的に破棄されるため、通常は問題は発生しません。

動的オブジェクトの場合valgrindなどのメモリプロファイリングツールをMassifで使用するか、クラスの演算子と演算子を置き換えnewdeleteて診断情報を収集することができます。


編集:更新されたQに対処します。

次のコードでは、vスコープがブロックであることを知っていますが、ifブロックの開始/終了時または関数の開始/終了時にメモリ内で作成/破棄されたifかどうかを知りたいですか?vfunc

v宣言されたスコープが開始され、宣言されたステートメントが実行されたときに作成されます。vスコープが終了すると、つまり}到達すると破棄されます。
この概念は、リソース割り当てとして知られるC ++で最も広く使用されている概念の1つであるInitialization(RAII)の基礎を形成するために使用されます。すべてのC++プログラマーは絶対にそれについて知っている必要があります。

この小さな変更されたコードサンプルを使用して、オブジェクトの作成と破棄をデモンストレーションおよび検証するのは簡単です。

#include<iostream>
class Myclass
{
    public:
        Myclass(){std::cout<<"\nIn Myclass Constructor ";}
        ~Myclass(){std::cout<<"\nIn Myclass Destructor";}
};

void func()
{
    std::cout<<"\nBefore Scope Begins";
    if (true)
    {
        Myclass obj;//automatic storage class
    }
    std::cout<<"\nAfter Scope Ends";
}

int main()
{
    std::cout<<"\nBefore Calling func()";
    func();
    std::cout<<"\nAfter Calling func()";
    return 0;
}

出力は次のとおりです。

func()を呼び出す
前スコープ
がMyclassコンストラクタで開始する前
Myclassデストラクタで
スコープが終了
した後func()を呼び出した後

于 2012-05-20T15:49:30.827 に答える
0

ローカル変数のスコープは、囲んでいるブロックが終了するまで、宣言の下にあるすべてのコードに制限されます。変数は、元のブロックで囲まれている他のブロックにも表示されます。

より詳しい情報

于 2012-05-20T15:58:18.483 に答える
0

ローカル変数オブジェクトの場合、そのオブジェクトの存続期間は、変数が宣言されたブロックの終わりで終了します。例:

Foo x;            //  lifetime of "x" begins

{
    some_stuff();

    Foo y;        //  lifetime of "y" begins

    Foo & a = x;  //  local variable "a", no new object

    more_stuff();

}                 //  lifetime of "y" ends; "y" and "a" go out of scope

                  //  (lifetime of "x" ends with its surrounding scope,
                  //   or end of program if it was global)
于 2012-05-20T16:11:42.920 に答える