C--程序基本数据量的存储

量值与数据

变量

常量

常量的定义:C语言中,通过内联方式直接写到源代码中的字面量值一般被称为常量。
那么我们这里引出一个问题,const关键字按照与定义变量相同语法定义的量,也是常量,但它与字面常量有什么区别呢?

我们首先明确一点,二者的值在其第一次出现时便被确定且无法被再次修改

所以只读变量和字面量常量的最重要的区别就是:const修饰的只读变量不具有常量表达式的属性因此不能用来表示数组大小或使用在case语句中。其次,常量表达式本身会在程序编译阶段求值,而只读变量的值只能在程序实际运行时才被得知。并且编译器通常并不会对只读变量进行内联处理,因此其求值不符合常量表达式特征。(常量表达式会被内联处理)

数据存储形式

通常采用补码来存放有符号整数,使用直接对应的二进制位格式来存放无符号整数,使用IEEE-754标准存放浮点数。
在计算机眼里,其实没有正负数之分,符号性的差异仅仅体现在计算机指令操作数据时的具体使用方式上。

数据存储位置

变量根据其定义所在位置,可以被划分为全局变量、局部变量。
进一步地,可以通过添加static关键字,将其标记为静态类型,延长变量的生存周期并限定其可见范围为当前的编译单元,即变量所在当前源文件;通过添加register关键字,可以建议编译器将变量值存放在寄存器中,提升读写性能。
不同变量也会被存放在虚拟内存地址的不同空间:

在这里插入图片描述
接下来我们展开讲讲:
首先是初始化的全局变量和静态变量,这类变量的值具有与应用程序相同的生命周期,它们的值通常会被存放在虚拟地址空间的.data中。

我们这里先简单理解:应用程序在被正常加载和运行之前,需要首先将应用程序代码及其相关依赖项的数据映射到内存中的某个位置,这段包含应用程序正常运行所必备数据的内存段即进程的VAS(Vitrual Address Space)

局部变量一般会被存放在寄存器或应用程序VAS的栈内存中

未初始化的全局变量和静态变量以及直接通过malloc、calloc等创建的内存块所包含的数据,他们分别被存放在进程VAS的.bss和堆内存中。

最后,不同类型的常量数据存储方式是不同的。他们会按照数据的大小和类型被选择性地放进VAS的.rodata(readonly data)和.text(代码段)中。
一般常量存储规律:如果内联常量较大,则会被单独存放到.rodata中,否则会直接内联到.text中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值