Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看:
size a.out
text data bss dec hex filename
163926481911777 a.out
可见,数据是分配 text 段,data 段,bss 段,这里使用size 命令的查看只能是看到这三个段的大小(编译的阶段就可以确定下来)而,堆、栈则是在运行的时候动态去分配空间的。
一、Linux 段的分配
text:代码段,存储代码、常量、字符串等只读的数据
data: 数据段,保存的是有经过初始化的全局变量和静态变量的部分。这里的初始化,初始化的值必须不能为零
bss: bss 段,保存的是没有经过初始化的全局变量、静态变量和初始化的值为零的全局变量和静态变量。
堆(heap): 用于动态内存的分配额哦,程序猿手动调用 malloc 进行分配和释放。
栈(stack):存放局部变量和函数的参数等。
二、大小的比对
计算 size a.out 的大小
原始的大小;
int
main()
{
printf(
"
hellow worldn
"
);
}
text data bss dec hex filename
1132
256
8
1396
574 a.out
1、局部变量是存储在栈中:
int
main()
{
int
a;
printf(
"
hellow worldn
"
);
}
~
text data bss dec hex filename
113225681396574 a.out
2、局部变量(局部数组)也是存储在栈中:
int
main()
{
int
a;
int b[100];
printf("hellow worldn");
}
text data bss dec hex filename
113225681396574 a.out
3、字符串(常量是存储在text中)
int
main()
{
int
a;
int b[100] = L"qxj511";
printf("hellow worldn");
}
text data bss dec hex filename
163925681903 76f a.out
4、没有经过初始化的静态变量是存储在 BSS 段中:
int
main()
{
int
a;
int b[100] = L"qxj511";
static c;
printf("hellow worldn");
}
text data bss dec hex filename
1639256121907773 a.out
5、经过初始化的静态变量是存储在 data 段中:
int
main()
{
int
a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow worldn");
}
text data bss dec hex filename
163926081907773 a.out
6、没有经过初始化的全部变量存储在 bss 端中:
int
d;
int
main()
{
int
a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow worldn");
}
text data bss dec hex filename
1639260121911777 a.out
7、经过初始化的全局变量存储在 data 段中:
int d = 1;
int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow worldn");
}
text data bss dec hex filename
163926481911777 a.out
原文:http://www.cnblogs.com/qxj511/p/5084103.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!