C++变量函数的声明定义与内存模型

变量声明:告诉编译器存在此类型的变量。
变量定义:告诉编译器要创建一个变量,并给该变量分配内存空间,定义包含了声明。

extern char cat;	//变量声明,存在一个变量,其内存空间为1个字节。
int dog;	//变量声明加定义,创建一个变量,给它分配4个字节的内存空间。

函数声明:告诉编译器存在此类型的变量。
函数定义:告诉编译器函数的内容,实质是一堆由CPU执行的指令,定义包含了声明。

类型的定义:告诉编译器创建一个数据类型,定义class、union、struct、enum以及typedef都为此类。

C++程序需要遵循单定义原则(One-Define-Rule,ODR)
对于非内联函数、有外部链接性的变量(在不同命名空间或不同代码块中声明的变量不视为同一变量)在整个程序整个程序中最多存在一个定义。对于类(包括struct、union、enum)和内联函数,在每个翻译单元中最多被定义一次,而且要保证不同翻译单元之间定义的一致性。

注:由于这种规则,编译器允许对于同一个类,如果不同翻译单元拥有不同的定义,有可能会发生错误。对多个静态库共用的头文件进行修改时,只更新部分静态库,可能导致此问题。

c++存储数据的方式根据数据保留在内存中的时间可分为以下三种:
自动存储持续性:函数中的声明变量,从函数开始到结束。
静态存储持续性:在函数外定义和使用static定义的变量,在程序整个运行过程中都存在。
动态存储持续性:用new分配的内存,直到delete为止。

在函数或一个代码块(函数体就是代码块)内部声明的变量,称为局部变量
默认情况下,局部变量存储持续性为自动,作用域为局部,没有链接性(不能被外部模块引用)。如果添加关键字static,变量存储持续性会变成静态。

在函数外部声明的变量,称为全局变量
全局变量的存储持续性为静态,作用域为整个文件,链接性为外部。如果添加关键字static,变量链接性变为内部,即不可被外部模块引用。

C++程序在编译过后生成的可执行文件中,有许许多多的段(.text、.data、.rodata、.bss等),在可执行文件被加载时,为了避免空间浪费,有着同样访问权限的段被合并为一个段。从操作系统的角度来说,一个段被映射到一个虚拟内存区域(VMA),运行时所谓的数据段、栈等其实就是这些VMA。

运行时内存分布:
数据段:全局变量、局部静态变量。
代码段:程序指令、字符串常量、全局const变量。
堆:动态分配的内存。
栈:局部变量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值