C++--函数,变量,数组底层表现
来源:互联网 发布:caffe在windows安装 编辑:程序博客网 时间:2024/06/05 16:22
函数的工作原理
函数只有在调用时才开辟内存空间,不过在编译期间会被编译成全局可执行的二进制代码,这也是调用时之所以能找到对应函数的原因。 函数调用其底层操作是创建了一个栈空间,而函数的入口地址,参数,临时变量等就是先通过push入栈,返回时pop出栈释放,保存栈平衡,系统自动管理内存。这个栈通过ebp(栈底)和esp(栈顶)两个寄存器管理控制。变量在内存中的表现形式
局部变量:保存在栈区,运行时对应申请的内存,生命周期就是在自己的作用域内。
全局变量:表现类似常量,在编译时就已经存在,其内存地址由编译器在运行前就分配了,全局可见。和静态变量一样,它们都存在全局数据区,程序结束后释放空间。
静态变量:分为全局静态和局部静态,前者和全局变量类似,而后者其存在域和全局变量一样,但其又和局部变量一样限定了作用域,只在自己作用域内可见,而且静态变量反复调用也只会初始化一次。其原因是:(1)它汇编操作时有个标志位来标志是否已经初始化了,以此来限定它只被初始化一次。(2)局部静态变量的创建会改变它本来的名字,叫名称粉碎法。以此来实现存在域全局,可见性局部。
堆空间:存放动态内存,需要自己手动管理内存,理论上可以通过其他方式代替堆区内存的申请,这样就不需要自己管理内存,但有时很不方便。而使用堆空间就一定要注意内存的管理,new与delete要一一对应,现在有种新的手段来管理内存,不需要我们手动控制–智能指针,其实就是为每个对象还维护了一个引用计数,记录对象被引用的次数,创建引用计数加一,销毁引用计数减一,当计数为零时对象释放。(堆的底层是通过一个双向链表实现的)数组和指针的寻址
1,数组名是一个地址常量值,而指针则是一个变量。
2,数组做形参,下标可以忽略,其实现在就是一个指针变量,保存的是数组首地址。(形参处的数组名是指针变量,实参处的数组名是地址常量)
3,数组作为函数返回值,要注意数组不能创建在栈区,否则出了作用域会自动释放。
4,数组可以通过下标形式或指针形式访问,但指针要比下标形式多一次寻址(即需要先取出指针保存的地址),效率要低点,然而指针要更加灵活。
5,多维数组最终都会被编译器转换为一维数组形式,内存中是没有多维概念的,都是连续存储的。
- C++--函数,变量,数组底层表现
- C语言底层函数
- c/c++函数返回局部变量数组
- 函数指针数组和C变量的定义方式
- c语言复杂变量声明(数组、指针、函数)
- C语言程序设计之基础(变量、运算符、数组、函数)
- 变量函数引用数组
- 数组、指针、函数、变量
- 【c基础】c语言 变量 数组元素 数组名做函数参数传递
- C语言函数调用的底层机制
- C语言函数调用的底层机制
- C语言函数调用的底层机制
- c语言 函数变量
- c 变量交换函数
- C++——定义变量的底层实现理解
- C++ static CString 变量在成员函数与全局函数中的不同表现
- c++:变量,数组和指针
- study c(vc中测试过)——数组和函数,变量范围
- 运动检测(前景检测)之(二)混合高斯模型GMM
- IOS菜鸟的所感所思(二)——UIKit中的UIDynamicAnimator
- 5.zookeeper原理解析-数据存储之ZKDatabase
- Spark分布式计算和RDD模型研究
- 直接使用Sublime Text实现:HTTP访问URL+格式化返回的JSON字符串
- C++--函数,变量,数组底层表现
- iOS开发之扫描二维码功能的实现
- hdu1558 Segment set
- 6.zookeeper原理解析-数据存储小结
- 基于蓝牙BLE的智能设备开发(一)
- 【Java总结-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSet
- Android开发秘籍学习笔记(三)
- Mac下反编译AndroidAPK
- C++中STL STD::list使用说明