C++のメモリ分類


1.C++のメモリは5つの領域に分けられます.
(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は初期化されていないためメモリが割り当てられていない.