C+|C++コアプログラミング(一、二)メモリ空間と参照
3601 ワード
C++コアプログラミング(一、二)メモリ空間と参照
1メモリパーティションモデル
1.1メモリ四領域
C++プログラミングでは、メモリはコード領域、グローバル領域、スタック領域、スタック領域の4つの部分に分けられます.この4つの領域はメモリにそれぞれ領域化され、領域と領域の間に一定の距離がある.一般的に、メモリを分割するときは、エリア内で連続的に分割されます.
これらのセクションは、次のデータをそれぞれ管理します.コード領域:関数体のコードを格納し、すべてのコードはコンパイル後の実行前にすべてコード領域に配置され、オペレーティングシステムによって直接管理される.一般的にはこの地域には触れません. グローバル領域:コンパイル後の実行前に存在し、グローバル変数(関数体にない変数)、静的変数(staticによって修飾された変数)、グローバル定数(constによって修飾された)、文字列定数が格納されます.プログラムの実行が完了すると自動的に解放されます. スタック領域:実行後に存在し、グローバル領域以外のすべてのシステムが自動的に割り当てられ、自動的に解放されるメモリ領域を格納します.一般に、関数体の実行が終了すると自動的に解放されます. スタック領域:実行後に存在し、すべてのプログラマが割り当てられたメモリ領域を制御します.プログラマ制御割当、プログラマ制御解放 C++には、変数を作成するようにオブジェクトを作成する方法と、newキーを使用する方法が2つあるからです.私は実験をした.コードは次のとおりです.
最終的な実行結果は次のとおりです.
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演算子を使用して、スタック領域に基本データ型、オブジェクト、構造を作成できます.ポインタが返されます.
もちろん、配列を作成することもできます.
2参照
2.1参照の基本的な使用
役割:変数に別名を付ける
構文:
2.2引用の具体的な使用
前述したように、パラメータや戻り値としてアドレスメソッドを使用すると、メモリ領域を節約できます.引用の本質はポインタ定数なので、引用を使うのも同じだと書きました.
ただし、具体的に使用する場合は、2つの点に注意してください.ローカル変数の参照を戻り値としないでください(解放されます). の戻り値は左の値とすることができる. 修正したくない場合は、
1メモリパーティションモデル
1.1メモリ四領域
C++プログラミングでは、メモリはコード領域、グローバル領域、スタック領域、スタック領域の4つの部分に分けられます.この4つの領域はメモリにそれぞれ領域化され、領域と領域の間に一定の距離がある.一般的に、メモリを分割するときは、エリア内で連続的に分割されます.
これらのセクションは、次のデータをそれぞれ管理します.
//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
などの定数で参照できます.