1. C/C++编译的程序占用的内存
1.1 可以看出,此可执行程序在存储时(没有调入到内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。
(1)代码区(text segment)
放CPU执行的机器指令(machine instructions)。
(2)全局初始化数据区/静态数据区(initialized data segment/data segment)
该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。
例如,一个不在任何函数内的声明(全局数据):
int i = 0; /*变量i根据初始值存放到全局初始化数据区*/
char* str = "abcd" /*abcd存放在文字常量区*/
(3)未初始化数据区(uninitialized data segment),也称BSS区(block started by symbol)
该区存放程序中未初始化的全局变量。
static int i; /*假设声明在函数外*/
话说,静态全局变量不是默认初始化为0吗?
1.2 一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。
(4)栈区
栈又称堆栈,英文statck,由编译器自动分配释放,存放函数的参数值、局部变量的值等(不包括static声明的变量,static意味着在数据段中存放变量)。除此之外,在函数被调用时,栈用来传递参数和返回值。由于栈先进后出、后进先出的特点,栈特别方便的用来保存和恢复调用现场。
(5)堆区
用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。
C程序执行时的内存分配情况示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int a = 0; /*全局初始化区*/
int b; /*全局未初始化区 BSS*/
char* p1; /*全局未初始化区 BSS*/
int main()
{
int b; /*栈*/
char s[] = "abc"; /*栈*/
char* p2; /*栈*/
char* p3 = "123456"; /*123456/0在常量区,p3在栈上*/
static int c = 0; /*全局(静态)初始化区*/
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); /*分配得来得10和20字节的区域就在堆*/
strcpy( p1, "123456"); /*123456/0在常量区,编译器可能会将p1与p3指向的"123456"优化成一个地方*/
return 0;
}
这段代码我没有验证