C++——定义变量的底层实现理解
2016-04-08 19:07
309 查看
我们在定义一个变量的时候,编译器会在内存中为其分配响应的存储空间。不知你有没有注意到,比如:int a=10;a地址是:0xXXXXXXXX。在a的地址中存储的是10这个常量数字,这个地址空间被分配给变量a了。在此,我们可能会产生一个疑问变量名a是放在哪个哪里的,如果变量名a没有存储到某一个位置,那么编译器又是通过什么来锁定a的地址空间的呢?
说到这里,我们需要来说一下,其实我是个C/C++菜鸟,目前还没能够理解C/C++的核心思想。下面,我们讲解,只是对基础学习同仁传授一个合理的理解方式。
我们知道OS对每个运行的程序都会虚拟出一个虚拟地址空间来供该程序使用这个地址空间大小是4G,这里从上到下有:内核区和用户区。我们主要关注用户区的3G空间。
回到变量定义上来,我们定义的局部变量是在栈空间区域分配存储空间的,而变量名a是存放在符号表中的变量表里面。变量表里定义了:变量的名称,变量的类型,变量的所指的空间,这里有点类似于数组名相当于数组的首地址。符号表中存储变量a的名称,之后存储a的地址空间,当编译器需要调用变量a时,就会自动在符号表中扫描知道找到变量a的名称为止,然后再提取出变量a后面的地址,根据这个地址到虚拟内存空间中找到变量a的数值,进行操作。
当需要删除变量a时,只需要OS只是删除符号表中的变量a这一项。(也可能是把变量a对应的地址空间的值置为某个值后再删除符号表中的变量a项。这里我们不具体讨论,到以后熟悉了C底层的实现原理,再来更正我的理解)。
附加一张图:
说到这里,我们需要来说一下,其实我是个C/C++菜鸟,目前还没能够理解C/C++的核心思想。下面,我们讲解,只是对基础学习同仁传授一个合理的理解方式。
我们知道OS对每个运行的程序都会虚拟出一个虚拟地址空间来供该程序使用这个地址空间大小是4G,这里从上到下有:内核区和用户区。我们主要关注用户区的3G空间。
回到变量定义上来,我们定义的局部变量是在栈空间区域分配存储空间的,而变量名a是存放在符号表中的变量表里面。变量表里定义了:变量的名称,变量的类型,变量的所指的空间,这里有点类似于数组名相当于数组的首地址。符号表中存储变量a的名称,之后存储a的地址空间,当编译器需要调用变量a时,就会自动在符号表中扫描知道找到变量a的名称为止,然后再提取出变量a后面的地址,根据这个地址到虚拟内存空间中找到变量a的数值,进行操作。
当需要删除变量a时,只需要OS只是删除符号表中的变量a这一项。(也可能是把变量a对应的地址空间的值置为某个值后再删除符号表中的变量a项。这里我们不具体讨论,到以后熟悉了C底层的实现原理,再来更正我的理解)。
附加一张图:
相关文章推荐
- STL学习笔记— —容器set和multiset
- C语言连续子向量的最大和及时间度量:
- C/C++ 子类调用父类中的私有成员变量(对比JAVA)
- 趣味魔方 每行每列对角线的和相等 C语言
- c++上机实验4
- C语言之数组和字符串
- C++从键盘输入多位数数组进行排序
- Dev-C++程序正确闪退问题
- C++中 pointers and const
- c++接受键盘输入处理
- C++实现——01背包问题
- bzero 和memset的区别
- C++
- windows下创建并使用静态链接库(.lib)
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
- 要看懂OpenCV的代码,所需要的C和C++的基础知识
- c++中重载,重写,重定义
- 常用排序算法实现(C++)
- hihocoder #1051补提交卡
- 『C++ Primer学习笔记』Chapter 4