C++--函数,变量,数组底层表现

来源:互联网 发布:caffe在windows安装 编辑:程序博客网 时间:2024/06/05 16:22
  • 函数的工作原理
    函数只有在调用时才开辟内存空间,不过在编译期间会被编译成全局可执行的二进制代码,这也是调用时之所以能找到对应函数的原因。 函数调用其底层操作是创建了一个栈空间,而函数的入口地址,参数,临时变量等就是先通过push入栈,返回时pop出栈释放,保存栈平衡,系统自动管理内存。这个栈通过ebp(栈底)和esp(栈顶)两个寄存器管理控制。

  • 变量在内存中的表现形式
    局部变量:保存在栈区,运行时对应申请的内存,生命周期就是在自己的作用域内。
    全局变量:表现类似常量,在编译时就已经存在,其内存地址由编译器在运行前就分配了,全局可见。和静态变量一样,它们都存在全局数据区,程序结束后释放空间。
    静态变量:分为全局静态和局部静态,前者和全局变量类似,而后者其存在域和全局变量一样,但其又和局部变量一样限定了作用域,只在自己作用域内可见,而且静态变量反复调用也只会初始化一次。其原因是:(1)它汇编操作时有个标志位来标志是否已经初始化了,以此来限定它只被初始化一次。(2)局部静态变量的创建会改变它本来的名字,叫名称粉碎法。以此来实现存在域全局,可见性局部。
    堆空间:存放动态内存,需要自己手动管理内存,理论上可以通过其他方式代替堆区内存的申请,这样就不需要自己管理内存,但有时很不方便。而使用堆空间就一定要注意内存的管理,new与delete要一一对应,现在有种新的手段来管理内存,不需要我们手动控制–智能指针,其实就是为每个对象还维护了一个引用计数,记录对象被引用的次数,创建引用计数加一,销毁引用计数减一,当计数为零时对象释放。(堆的底层是通过一个双向链表实现的)

  • 数组和指针的寻址
    1,数组名是一个地址常量值,而指针则是一个变量。
    2,数组做形参,下标可以忽略,其实现在就是一个指针变量,保存的是数组首地址。(形参处的数组名是指针变量,实参处的数组名是地址常量)
    3,数组作为函数返回值,要注意数组不能创建在栈区,否则出了作用域会自动释放。
    4,数组可以通过下标形式或指针形式访问,但指针要比下标形式多一次寻址(即需要先取出指针保存的地址),效率要低点,然而指针要更加灵活。
    5,多维数组最终都会被编译器转换为一维数组形式,内存中是没有多维概念的,都是连续存储的。

0 0
原创粉丝点击