自然不会,每一个变量(包括函数)都有自己的生命周期,程序结束后释放所有的内存,程序运行时只有被声明为inline内联函数,或者正在被调用的函数(也就是你上面收提及的第一种情况)存储在内存中(栈区),调用完毕后立即释放内存。
回答完毕,祝楼主学习进步。
你这个问题回答起来比较复杂。首先C语言肯定是被编译到了机器代码了,机器代码只有被装载到内存后由才可以被CPU执行。机器代码被我们称为可执行文件,具体而言就是一种有格式的文件linux上面一般是ELF格式,windows上一般为PE格式。说白了操作系统干的事情就是读文件然后给CPU执行的过程。一个函数就是一条跳转指令,告诉系统我该跳转到哪一行。
而且现代的操作系统都有设计动态链接库,所以如果你的函数是动态加载的,那么它不会一开始就加载到内存里面。另外,由于内存分页原理,如果程序不是立即被执行,也可能交换到磁盘上。如何调度和操作系统相关。
你所关心的问题其实是可执行程序的加载过程。对于ELF格式的文件而言这个过程可以简单的理解为:
用户通过shell执行程序,shell通过execve进入系统调用。(User-Mode)
sys_execve经过一系列过程,并最终通过ELF文件的处理函数load_elf_binary将用户程序和ELF解释器加载进内存,并将控制权交给解释器。(Kernel-Mode)
ELF解释器进行相关库的加载,并最终把控制权交给用户程序。由解释器处理用户程序运行过程中符号的动态解析。(User-Mode)
没错,函数在代码段,会被加载到内存,调用函数时,通过call指令跳转到函数所在的内存地址执行函数。
对代码用OD调试、反汇编,可以看到函数所在的内存地址。
对于Windows下,一般可执行文件是以PE格式存在的。如果对加载细节感兴趣,搜索“PE文件格式详解”。
一般来讲,程序不是很大的时候,程序的代码肯定都会装载到内存中,除非是程序大到没法全部装入操作系统给其分配的空间的时候,就会有一部分存在外存,用的时候替换进去
不会。C是用一次执行一次,不用时释放。不过你的变量得都是临时变量才不会占多余空间,如果是指针就保存到你指向的变量;如果是全局变量的话一开始就会占空间。