C/C++ 程序進程在內存中的分佈

c/c++程序進程在內存中的表示包括:

  1. 文本段
  2. 初始化數據段
  3. 未初始化數據段

  1. 文本段, 也稱作代碼段。 主要包含可執行代碼,這部分是隻讀的。
  2. 初始化數據段,也通常簡稱爲數據段。它包含全局變量和由程序員初始化的靜態變量。
    這部分還可以細分爲只讀部分和可讀可寫的部分,例如定義在主函數之外的變量(全局)
char s[] = "hello";
static int i = 1;

這兩個變量存儲在已初始化的讀寫區。

然而,全局變量

char *ss = "world";

變量*ss存儲的字符串“world”是存放在只讀部分(常量區)。
3. 未初始化數據段,常備稱爲BSS段(BlockStarted bySymbol),這部分通常存儲未被程序員初始化的變量,但是這些變量會被系統自動初始化爲0.,值得注意的是,那些被程序員初始化爲0的全局變量也會被存儲在這個區域。

4.堆,動態內存分配的區域,這部分區域被malloc,realloc 和 free 進行分配和釋放。堆一般是被程序中的動態共享庫和動態加載模塊所共享。

5.棧,一般位於內存的高地址處,動態的局部變量一般都存儲於棧中。

下面通過程序實例來演示程序各部分在內存中的分佈。

i.

#include <stdio.h>

int main(void)
{
    return 0;
}

通過系統命令查看程序在內存各部分的分佈,

[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text       data        bss        dec        hex    filename
960        248          8       1216        4c0    memory-layout

ii. 增加一個全局變量之後,

#include <stdio.h>

int global; /* Uninitialized variable stored in bss*/

int main(void)
{
    return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text       data        bss        dec        hex    filename
 960        248         12       1220        4c4    memory-layout

iii. 再增加一個未初始化靜態變量,

#include <stdio.h>

int global; /* Uninitialized variable stored in bss*/

int main(void)
{
    static int i; /* Uninitialized static variable stored in bss */
    return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text       data        bss        dec        hex    filename
 960        248        16       1224        4c8    memory-layout

iiii. 靜態變量初始化之後,

#include <stdio.h>

int global; /* Uninitialized variable stored in bss*/

int main(void)
{
    static int i = 100; /* Initialized static variable stored in DS*/
    return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text       data        bss        dec        hex    filename
960        252         12      1224        4c8    memory-layout

v. 初始化全局變量之後,

#include <stdio.h>

int global = 10; /* initialized global variable stored in DS*/

int main(void)
{
    static int i = 100; /* Initialized static variable stored in DS*/
    return 0;
}
[narendra@CentOS]$ gcc memory-layout.c -o memory-layout
[narendra@CentOS]$ size memory-layout
text       data        bss        dec        hex    filename
960         256          8       1224        4c8    memory-layout

翻譯自:http://www.geeksforgeeks.org/memory-layout-of-c-program/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章