<目次>
(1) C++の動的メモリ割当と静的メモリ割当の違いについて
(1-1) 静的メモリ割当てとは?
(1-2) 動的メモリとは?
(1-3) 動的メモリの割当て
(1-4) 「静的メモリ割当て」と「動的メモリ割当て」の違い
(1) C++の動的メモリ割当と静的メモリ割当の違いについて
(1-1) 静的メモリ割当てとは?
#include <iostream>
using namespace std;
int main()
{
//# 静的メモリ割当て
int a1;
int b1[10];
double d1;
char c1;
return 0;
}
(1-2) 動的メモリとは?
(1-3) 動的メモリの割当て
(1-3-1) 割当て方法
int * hoge1 = new int;
int * hoge2 = new int [5];
(1-3-2) 要素へのアクセス(先頭)
//# ポインタ「*hoge」へのアクセス方法1 hoge[0] //# ポインタ「*hoge」へのアクセス方法2 *hoge
#include <iostream>
using namespace std;
int main(void){
//# ポインタ「*n1p」を定義
int n1 = 10;
int *n1p = &n1;
//# ポインタ「*n2p」を定義
int *n2p = new int;
n2p[0] = 10;
//# 2通りの方法でアクセス
cout << "アクセス方法1:" << *n2p << " アドレス:" << n2p<< endl;
cout << "アクセス方法2:" << n2p[0] << " アドレス:" << &n2p[0] << endl;
delete []n1p;
delete []n2p;
}
(1-3-2) 要素へのアクセス(2番目以降)
//# ポインタ「*hoge」へのアクセス方法2 hoge[1] //# ポインタ「*hoge」へのアクセス方法2 *(hoge+1)
#include <iostream>
using namespace std;
int main(void){
//# ポインタ「*n2p」を定義
int *n2p = new int[5];
n2p[0] = 10;
n2p[1] = 25;
//# 2通りの方法でアクセス
cout << "要素2へのアクセス方法1:" << *(n2p+1) << " 要素2のアドレス:" << (n2p+1)<< endl;
cout << "要素2へのアクセス方法2:" << n2p[1] << " 要素2のアドレス:" << &n2p[1] << endl;
delete []n2p;
}
(1-4) 「静的メモリ割当て」と「動的メモリ割当て」の違い
| ●観点 | ●静的メモリ割当て | ●動的メモリ割当て |
| 差異① タイミング |
プログラム実行前(コンパイル時)に割当て | プログラム実行中に割当て |
| 差異② ポインタ要否 |
割当てを行うにはポインタは不要(「int n1p[5];」のように宣言可能) | 割当てを行うにはポインタが必要(「int *n2p = new int[5];」のように宣言する必要あり) |
| 差異③ 処理速度 |
動的割当てより、少し速い | 静的割当てより、少し遅い |
| 差異④ メモリ使用量 |
動的割当てより、多く必要 | 静的割当てより、少なく済む |
●差異②/差異④の確認
#include <iostream>
using namespace std;
int main(void){
//# 静的メモリ割当て
//# ポインタなしで割当て可能
int n1p[5];
n1p[0] = 9999;
cout << "n1pの要素1:" << n1p[0] << " サイズ:" << sizeof(n1p) << endl;
//# 動的メモリ割当て
//# 動的割当てにはポインタが必要
int *n2p = new int[5];
n2p[0] = 8888;
cout << "n2pの要素1:" << n2p[0] << " サイズ:" << sizeof(n2p) << endl;
}