C++のメモリ分類
1.C++のメモリは5つの領域に分けられます.
(1)スタックはローカル変数を格納し、関数形パラメータ呼び出し関数式システムは自動的にスタックを割り当てる
(2)newに格納されたメモリブロックをスタックに格納し、deleteを使用して直ちにクリーンアップしないとメモリが漏洩する
(3)自由記憶領域はmallocが申請したメモリブロックを格納し、
(4)グローバル変数/静的変数領域グローバル変数静的変数を格納
(5)定数領域整数文字列等を格納する定数
スタックとスタックの違い:
スタックはシステムによって自動的に割り当てられ、スタックはプログラマーが自分で申請し、システムはメモリの中で空きメモリを探し、対応する内容を空きメモリに書き込む.スタック申請効率は高いが、サイズに制限があり、スタック申請効率は低い.スタックは低アドレス方向に成長し,スタックは高アドレス方向に成長した.
コード:
上のコードで生成されたアセンブリコードは、次のとおりです.
アセンブリコードから分かるように、ポインタcはスタックオフセット0 x 2 cの位置にあり、ポインタeはスタックオフセット0 x 28の位置にあり、整数dはスタックオフセット0 x 24の位置にあり、変数aとbは初期化されていないためメモリが割り当てられていない.
(1)スタックはローカル変数を格納し、関数形パラメータ呼び出し関数式システムは自動的にスタックを割り当てる
(2)newに格納されたメモリブロックをスタックに格納し、deleteを使用して直ちにクリーンアップしないとメモリが漏洩する
(3)自由記憶領域はmallocが申請したメモリブロックを格納し、
(4)グローバル変数/静的変数領域グローバル変数静的変数を格納
(5)定数領域整数文字列等を格納する定数
スタックとスタックの違い:
スタックはシステムによって自動的に割り当てられ、スタックはプログラマーが自分で申請し、システムはメモリの中で空きメモリを探し、対応する内容を空きメモリに書き込む.スタック申請効率は高いが、サイズに制限があり、スタック申請効率は低い.スタックは低アドレス方向に成長し,スタックは高アドレス方向に成長した.
コード:
# include <iostream>
using namespace std;
# include <stdlib.h>
int global=1; // /
int main()
{
int a;
char b[12];
char *c=new char (); //
char *e=(char *)malloc(8*sizeof(char)); // , e
int d=5; //
return 0;
}
上のコードで生成されたアセンブリコードは、次のとおりです.
gdb) disas main
Dump of assembler code for function main:
0x004016b0 <+0>: push %ebp
0x004016b1 <+1>: mov %esp,%ebp
0x004016b3 <+3>: and $0xfffffff0,%esp
0x004016b6 <+6>: sub $0x30,%esp
0x004016b9 <+9>: call 0x401d00 <__main>
0x004016be <+14>: movl $0x1,(%esp)
0x004016c5 <+21>: call 0x401760 <_Znwj>
0x004016ca <+26>: movb $0x0,(%eax)
0x004016cd <+29>: mov %eax,0x2c(%esp)
0x004016d1 <+33>: mov $0x8,%eax
0x004016d6 <+38>: mov %eax,(%esp)
0x004016d9 <+41>: call 0x403728 <malloc>
0x004016de <+46>: mov %eax,0x28(%esp)
0x004016e2 <+50>: movl $0x5,0x24(%esp)
0x004016ea <+58>: mov $0x0,%eax
0x004016ef <+63>: jmp 0x4016f9 <main+73>
0x004016f1 <+65>: mov %eax,(%esp)
0x004016f4 <+68>: call 0x401f70 <_Unwind_Resume>
0x004016f9 <+73>: leave
0x004016fa <+74>: ret
End of assembler dump.
(gdb)
アセンブリコードから分かるように、ポインタcはスタックオフセット0 x 2 cの位置にあり、ポインタeはスタックオフセット0 x 28の位置にあり、整数dはスタックオフセット0 x 24の位置にあり、変数aとbは初期化されていないためメモリが割り当てられていない.