【技术研究】作用域 生命周期

TEC

Posted by Corax on November 10, 2023

定义编号多用字符char型。

任何类型可以转字符型,反过来不见得。

定长字符串,浪费空间,但查找快。

image-20231111094725701

二维数组传参,[] [x]第二个参数必须有。——涉及内存存储格式。

状态机 以信号驱动行为。当遇到什么,怎 么做,遇到另外的什么,怎么做。

对于循环,在编译器优化里,控制循环长度的语句中,在循环体内不涉及改变循环长度的情况下,语句中的内容会外提,(函数除外),因为没有必要每一次循环都计算长度。

image-20231111095924123

作用域 生命期

语法能访问的范围——变量存在的时间

  作用域 生命期
函数 变量开始到函数结束 进入函数分配空间,退出函数释放空间
变量开始到块结束 同函数
全局变量g_ 工程作用域,在工程中的所有源码互相访问 模块开始到模块卸载
静态全局 文件作用域 只在当前文件 同全局
静态局部 同函数 同全局

块 {}

就c近访问

image-20231111103321930

  • 编译期间检查,由编译器负责,检查作用域
  • 运行期间检查,由操作系统负责,检查生命期

就像定义一个空指针,在编译的时候不会有问题,运行的时候就会C05报错了。

熟悉内存结构,可以越过编译检查,在作用域外面访问到作用域以内的信息。

image-20231111103232267

全局变量,联合编译

image-20231111103857023

image-20231111103922562

image-20231111103936226

IDE自动编译 链接起来

image-20231111104053832

还需要声明回来,再使用

image-20231111104151467

数据区分为已分配和未分配,全局变量卸载已分配的可读写区。

下面这个是 上面未初始化,下面初始化了

image-20231111104629501

下面上面初始化,下面初始化

image-20231111104642991

可见是已分配的两个是否初始化区。

甚至编译完装载成可执行文件之后,不需要运行就写在文件里面了。

image-20231111104910876

.cpp支持函数返回值设置全局变量

​ 某函数在设置前运行,由_initterm()负责。

_cinit 初始化官方库需要的全局变量,相关支持。

未初始化变量 在编译链接的时候只需要声明这个变量需要多少空间,而不是全部赋0,也不是以下面赋初值的形式,用数据来塞满数据区。下图就很大了

image-20231111110127671

image-20231111110137303

而如果说我们需要可执行文件扩展出更多的区域执行 我们别的代码的时候,就可以多未初始化变量来操作。

如下 我们要变量数组

image-20231111110652917

image-20231111110716416

实际上下图也会预留空间,但不会显示到文件大小

全局 常量(一定是初始化的)区和未初始化区

image-20231111110823395

image-20231111110847829

编译器不管业务类型,只按照内存属性,可以看到常量区都是其他常量。

image-20231111110920860

静态全局变量 static静态 和全局一样,仅仅加上了编译器检查不让跨文件访问

编译可以,链接报错。

多次调用fun,是不断递增的,因为static int是初始化的,甚至都不定义,是在编译的时候就写进去的。

image-20231111112937934

相当于这里是没有代码的,刚开始被硬编码写进二进制文件

image-20231111114733924

编译机制问题 ,两个不是一个东西

image-20231111113628180

会加上作用域,和层级,称之为名称粉碎。

image-20231111113726893

设置粉碎机制

image-20231111114031920

查看二进制文件可以找到 C的

image-20231111114151212

image-20231111114211983

C++的

image-20231111114413669