一、程序的内存分配
一个由c/c++编译的程序占用的内存分为以下几个部分
文字常量区、全局/静态存储区、堆、栈
一个程序的3个基本段:.text段、.data段、.bss段
.text段在内存中是只读的,.data段与.bss段是可读写的。
.bss段通常是用来存放 未初始化或初始化为0的全局变量
.data段 指那些初始化过(非零)的非const的全局变量
.text段是放代码程序的,也有可能包含一些只读的常数变量,例如字符串常量。编译时确定。
.rodata段,ro代表read only,即只读数据(cosnt)
1.常量不一定就放在 rodata 里,有的立即数直接编码在指令里,存放在代码段(.text)中。
2.对于字符串常量,编译器会自动去掉重复的字符串,保证一个字符串在一个可执行文件(EXE/SO)中只存在一份拷贝。
3.rodata 是在多个进程间是共享的,这可以提高空间利用率。
//全局初始化区 .data
int a = 1;
//全局未初始化区 .bss
int b = 0;
char *p1;
main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; // 123456/0在rodata段,p3在栈上。
static int c =0; 全局(静态)初始化区 .data
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}