变量名存放在哪里?
这是一个有意思且无聊的问题,之前在网上看到有人问道这个问题,比如说在PHP里面我们写下 $name = "名字"
这样的代码语句,在代码运行的时候,$name 在哪里呢? 了解了变量在内存中存储方式的人会知道,一般变量的值在存放在栈内存里面的,但是名字呢?
针对这个问题,咱们先要区分一下编译型语言和解释型语言,这2种语言运行方式完全不一样,C/C++是典型的编译型语言,而且PHP/JS则是典型的解释型语言。
编译型语言要想运行,必须使用一个编译器去把代码转换成目标平台机器代码。而解释型语言是通过一个解释器实时翻译成一种中间代码一行行运行。前者又被称为静态语言,后者又被称为动态语言。像Java,C#则属于这2种中间,因为他们有一个预编译的过程,会先把代码转换成中间代码存放起来,在Java里面就叫字节码,然后在虚拟机(jvm)里面执行,效率比纯解释执行高。PHP就有一个opcache扩展可以把生成的中间代码opcode缓存起来以提高效率,不必每次运行的时候都生成。
说这么多,想说明一个问题,那就是变量名和变量在这2种语言里面的存储是有区别的,回到最开始的问题,咱先说说经典的C语言:
C语言里面变量和变量名的存储
为了说明这个问题,咱们简单的来说一下C里面变量在内存里面的存储:
1.栈区(stack)— 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
2.堆区(heap) — 一般由程序员分配释放, 用来存储数组,结构体,对象等。若程序员不释放,程序结束时可能由OS回收。
3.全局区(静态区)(static)— 存放全局变量、静态数据、常量。程序结束后由系统释放。
4.文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。
5.程序代码区 — 存放函数体(类成员函数和全局函数)的二进制代码。
栈内存是有大小限制的,比如默认情况下,Linux平台的是8MB,如果超过这个限制,就会出现 stackoverflow,而堆内存并无限制,内存有多大就可以申请多大。
看完上面的说明,我们可以得出一个结论: 全局变量存放在全局区,在程序一开始就分配好了,而且局部变量在存放在栈区,运行的时候分配内存,用完之后内存会被自动释放。
但是这好像并没有说明变量名在哪里吧?比如下面这段C代码,a, b到底存在哪里?:
#