<目次>
(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;
- }