符号与符号表

符号表与符号

  • 符号
    • 定义
      指分配了内存。为函数名指明了代码区,为变量名指明了静态数据区。即在可执行文件启动还没进入程序入口时,就在其所在地址空间为符号分配了内存。
    • 全局符号(GLOBAL)
      指在本编译单元内定义,可以被其他编译单元引用。如,非static的全局变量/函数[容易出现重定义链接时的问题]
    • 局部符号(LOCAL)
      指在本编译单元内定义,并且只能在本编译单元引用。如,static变量/函数
    • 外部符号
      指在其他编译单元定义,可在其他编译单元引用。如,extern限定的变量/函数
  • 符号表的工作
    • 符号解析
      将各个模块的引用符号与其他模块的定义符号建立绑定,若找不到,则出现链接上的问题。
    • 重定位
      将引用符号的地址重定位为相关联的定义符号的地址。

非static全局变量

i. 若在定义时未初始化,内置类型的,即执行值初始化。自定义类型则执行相应的默认构造函数。
ii. 容易出现多重定义问题
eg:

 main.cpp
 int d = 100;
 void p1();//函数声明
 int main(){
    p1();
    return 0;aa
 }

 test.cpp
 int d;//执行值初始化
 void p1(){
    d = 1;
 }
上述代码,在编译器中编写完后,不会出现错误,在链接阶段,报错,表明d多重定义。主要是在main.cpp中,d已经定义过一次了,在test.cpp中int d;不是声明,执行了值初始化。因此,出现了多重定义的错误。

static修饰的全局变量与static修饰的局部变量

i. 均只初始化一次,若未给出初始值,则执行值初始化。

自动变量

i. 生存期从声明的地方开始,到所在块作用域结束。
ii. 若未给出初始值,不可使用。
iii. 自动变量不放在符号表中,因为不被引用。
iv. 在编译时期,编译器为其规划好内存了,在可运行文件执行时,根据这些信息在栈区分配。

tip:
编译器分配内存,不够严谨,应该说编译器在编译期间,为程序的变量、函数等规划了内存使用方案,方案会写到可执行文件中,当EXE文件执行时,就启用方案分配内存。
posted @ 2020-03-04 19:35  LeeQMoon  阅读(663)  评论(0)    收藏  举报