C+|C++コアプログラミング(一、二)メモリ空間と参照

3601 ワード

C++コアプログラミング(一、二)メモリ空間と参照
1メモリパーティションモデル
1.1メモリ四領域
C++プログラミングでは、メモリはコード領域、グローバル領域、スタック領域、スタック領域の4つの部分に分けられます.この4つの領域はメモリにそれぞれ領域化され、領域と領域の間に一定の距離がある.一般的に、メモリを分割するときは、エリア内で連続的に分割されます.
これらのセクションは、次のデータをそれぞれ管理します.
  • コード領域:関数体のコードを格納し、すべてのコードはコンパイル後の実行前にすべてコード領域に配置され、オペレーティングシステムによって直接管理される.一般的にはこの地域には触れません.
  • グローバル領域:コンパイル後の実行前に存在し、グローバル変数(関数体にない変数)、静的変数(staticによって修飾された変数)、グローバル定数(constによって修飾された)、文字列定数が格納されます.プログラムの実行が完了すると自動的に解放されます.
  • スタック領域:実行後に存在し、グローバル領域以外のすべてのシステムが自動的に割り当てられ、自動的に解放されるメモリ領域を格納します.一般に、関数体の実行が終了すると自動的に解放されます.
  • スタック領域:実行後に存在し、すべてのプログラマが割り当てられたメモリ領域を制御します.プログラマ制御割当、プログラマ制御解放
  • C++には、変数を作成するようにオブジェクトを作成する方法と、newキーを使用する方法が2つあるからです.私は実験をした.コードは次のとおりです.
    //Person.h
    #pragma once
    #include
    #include
    class Person {
        std::string name;
        int year;
    
    public:
        Person() ;
        Person(std::string, int);
        ~Person() ;
    
        std::string getName();
        void setName(std::string);
    
        int getYear();
        void setYear(int);
    
    };
    //Person.cpp
    #include"Person.h"
    using namespace std;
    
    Person::Person() {
        cout << "Person constructed." << endl;
        name = "No Name.";
        year = 0;
    }
    
    Person::Person(string name, int year) {
        this->name = name;
        this->year = year;
        cout << "Person constructed." << endl;
    }
    
    Person::~Person() {
        cout << "Person destoryed." << endl;
    }
    
    string Person::getName() {
        return name;
    }
    
    void Person::setName(string name) {
        this->name = name;
    }
    
    int Person::getYear() {
        return year;
    }
    
    void Person::setYear(int year) {
        this->year = year;
    }
    //main.cpp
    #include"Person.h"
    
    int main() {
        using namespace std;
        Person* person1 = new Person("Yangtzi", 22);
        Person* person2 = new Person("Irene", 21);
        Person person3("AA", 20);
        Person person4("BB", 19);
    
        cout << "Address of person1: " << (int)person1 << endl;
        cout << "Address of person2: " << (int)person2 << endl;
        cout << "Address of person3: " << (int)&person3 << endl;
        cout << "Address of person4: " << (int)&person4 << endl;
    
        delete person1;
        delete person2;
    
        return 0;
    }

    最終的な実行結果は次のとおりです.
    Person constructed.
    Person constructed.
    Person constructed.
    Person constructed.
    Address of person1: 9040808
    Address of person2: 9040568
    Address of person3: 3471532
    Address of person4: 3471492
    Person destoryed.
    Person destoryed.
    Person destoryed.
    Person destoryed.
    newキーワードで作成したオブジェクトperson 1とperson 2はメモリ領域に属し、通常の変数で作成したperson 3とperson 4は別の領域に属することが容易にわかります.学習の結果,前者はスタック領域であり,後者はスタック領域であることが分かった.
    1.2 new演算子
    new演算子を使用して、スタック領域に基本データ型、オブジェクト、構造を作成できます.ポインタが返されます.int* p = new int(10); Person* p = new Person(); delete p;
    もちろん、配列を作成することもできます.int* p[] = new int[10]; delete [] p;
    2参照
    2.1参照の基本的な使用
    役割:変数に別名を付ける
    構文: & = ;具体的な実装:参照の本質はポインタ定数です.作成時には初期化する必要があり、初期化されると、その指向を変更することはできません.
    2.2引用の具体的な使用
    前述したように、パラメータや戻り値としてアドレスメソッドを使用すると、メモリ領域を節約できます.引用の本質はポインタ定数なので、引用を使うのも同じだと書きました.
    ただし、具体的に使用する場合は、2つの点に注意してください.
  • ローカル変数の参照を戻り値としないでください(解放されます).
  • の戻り値は左の値とすることができる.
  • 修正したくない場合は、const int& variableNameなどの定数で参照できます.