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