【C++】内存分布 | 变量内存分配位置

本文详细介绍了C++中不同类型的变量(全局、静态全局、局部和静态局部)及其内存分配位置,包括BSS段、DATA段、TEXT段。BSS段存放未初始化或初始化为0的全局变量,DATA段存储已初始化的非0全局变量和静态变量,TEXT段则包含代码。同时,探讨了变量生命周期与其内存分布的关系。
摘要由CSDN通过智能技术生成

C++变量(按作用域分类):

全局变量

具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态全局变量:

  1. 具有全局作用域
  2. 被static关键字修饰过的变量具有文件作用域。即他作用于定义它的文件里,不能作用到其他文件里。
  3. 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。

局部变量

只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

静态局部变量

具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

静态变量会被放在程序的静态数据存储区里,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是他与堆栈变量和堆变量的区别

C++内存分布(按内存空间分布):

  1. BSS段
  2. DATA段:包含堆、栈,静态存储区
  3. TEXT段(代码区(函数+成员函数的地方)

结论:

int g_golbalvalue1 = 0x5a5a;    /* 已经初始化的全局变量,存放在data段*/
static s_golbalvalue1 = 0x5a5a; /* 已经初始化的静态全局变量,存放在data段*/

int g_golbalvalue2 = 0;         /* 初始化为零全局变量,存放在bss段,不占用可执行文件空间*/
int g_golbalvalue3;             /* 未初始化的全局变量,存放在bss段,不占用可执行文件空间*/
static s_golbalvalue2 = 0;      /* 初始化为零的静态全局变量,存放在bss段,不占用可执行文件空间*/
static s_golbalvalue3;          /* 未初始化的静态全局变量,存放在bss段,不占用可执行文件空间*/

int main(void)
{
    static int value_slocal_1 = 12345678; /* 已经初始化的静态局部变量,存放在data段*/
    static int value_slocal_2 = 0;        /* 初始化位0的静态局部变量,存放在bss段*/
    static int value_slocal_3;            /*未初始化的静态局部变量,存放在bss段*/
    char *p = "WelCome to Confence"; 	  /*p为栈数据,存放在栈中,p指向的内容为字符串常量区,存放在字符常量区*/
    char *buf = malloc(100); 			  /* buf为栈数据,存放在栈中,但buf申请的空间为堆数据*/
}

BSS段(Block Started by Symbol:存放未初始化或者初始化为0的非const全局变量。 运行时确定。

  • bss段只占运行时的内存空间而不占可执行文件空间。 所以未初始化的全局变量 或者 初始化为0的全局变量,放在这里,因为这些变量不占用可执行文件空间,无需分配内存。运行时确定所以不占空间的原因。
  • 在程序运行的整个周期内,.bss段的数据一直存在。 所以为什么这里放全局变量,并能一直存在的。
  • 因为其内容由由内核初始化为0,裸机程序需要自行手动清零

DATA区:赋了初值且初值不为0的非const全局变量, 常量, 静态变量,堆中的变量等

所说的DATA区:包含了栈、堆、静态存储区等;

  1. 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
  2. 静态存储static区:全局变量和静态变量的存储是放在一块的.
  3. 堆区(heap):
    一般由程序员分配释放, 若程序员不释放,在程序结束时,操作系统回收
    堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还

代码段(TXT):在内存中被映射为只读,编译时确定。

  • 函数+成员函数的地方

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

总结:因为这些变量分布在不同的内存空间,这正是这些变量生命周期存在差异的原因。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值