当前位置:首页 » 编程软件 » 进入编译器后一个函数经历了什么

进入编译器后一个函数经历了什么

发布时间: 2022-05-02 19:42:58

⑴ C++中编译时遇到函数的定义,编译器做了哪些事,

程序在内存中分为四部分
代码段 (程序代码,比如你的函数)
静态段 (存放静态变量和全局变量,还有用到的字面值常量)
堆 (由程序员自己管理的内存,动态分配用的就是这部分内存) //动态分配的数组在这里
栈 (由操作系统管理,局部变量和临时变量存在这里) //自己定义的数组在这里

现在你应该知道自己定义的普通数组在哪里,动态分配的数组又在哪里了吧.

调用函数时都是值传递,就是把变量的值复制一份给函数这时就会新分配一块内存给函数中
接收这个值的那个变量,当函数结束时,这个变量被释放
引用调用不是值传递,而是让函数直接操作你传递的实参
高级一点: 引用其实也是值传递这种方式,只不过编译器偷偷给你变成了指针

⑵ 被C编译器编译后的函数是什么,编译后的东西是什么

这个还真忘了 不过在C的 目录下面可以找到的
与你的程序文件名一样 只不过扩展名不一样 我记得会有个EXE文件的 双击就执行你之前写的程序 那时候刚学编程 还觉得挺好玩的

⑶ 精品赏析:一个.NET程序在编译和运行时都做了些什么

run-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问。 这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(Commmon Language Specification)兼容的语言时,它将首先被编译成一种称为IL (Intermediate Language)的伪代码(pseudo-code)。在这个应用程序第一次 被运行的时候,这种IL代码将被编译成机器代码,用于执行。也就是说从源代码 到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码 才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节: 1) 你用C#开发一些程序 2) 用C#编译器或CLS兼容的编译器编译成EXE 3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32 可执行文件的只读部分。 4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。 这个函数是.NET EE(execution engine)--.NET运行期引擎的入口函数。 5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系 统将会调用位于MSCorEE.DLL中的_CorExeMain函数。 6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里 可以有很多程序同时运行。 7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将 指示操作系统调用_CorExeMain函数。 8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。 9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler) 这一即时编译过程只在第

⑷ 请问编译器是通过函数的入口地址来找到函数,那又是如何知道函数的结束呢

函数入口是一段指令的首地址,进入函数实际是从这段指令开始执行,执行到return语句,函数就结束了

⑸ 一直有个疑惑,C/C++编译器是如何调用函数的

函数的调用就是 跳转到函数体的入口地址。

函数体本身的存储空间是在exe里txt段,然后运行加载的时候映射到地址空间。不过看你的问题,你关注的不是这个的占用。

关于你问的问题, 其实是因为一旦定义了虚函数,在C++类型的头部,就会有一个指针的隐藏变量被定义,从而该类型的每个对象都会有这个变量的大小。 这个只有类型有和没有虚函数的区别,虚函数的个数造成内存增长只是虚表里(每class一个),每个对象里只是存的一个指针,不会有size变化。

对于非虚的函数,编译的时候,直接就是填写的函数体的入口地址; 而虚函数,则是要经过计算,先通过对象头部寸的虚表指针找到虚表,再去找对应的虚表项 ,里面存储的就是需要的函数的入口地址。

建议楼主看看 C++布局方面的书,比如 <Inside C++ Object Model>, 以及平时多用VS操练一下调试技巧,然后适当熟悉简单的汇编代码,对融会贯通很有帮助。

⑹ 简单说一下编译程序怎样编译一个函数

高级语言在编译的时候,编译器会生成汇编,进而生成二进制文件.

高级语言编译函数,先把函数的形参压栈(有时候还有状态寄存器等),再分配声明的局部变量的内存空间,然后是函数处理,最后是出栈.

⑺ c++编译后产生的一些文件是什么

c++程序在编译后,在目标路径下会生成多个文件:

Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg。

1、exe:是生成的可执行文件。

2、ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息。

3、obj:是目标文件,源程序编译后的产物。

4、pch:全称是PreCompiled Header,就是预先编译好的头文件。

5、idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度。

6、pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息。

(7)进入编译器后一个函数经历了什么扩展阅读:

工作原理:

C++语言的程序因为要体现高性能,所以都是编译型的。但其开发环境,为了方便测试,将调试环境做成解释型的。即开发过程中,以解释型的逐条语句执行方式来进行调试,以编译型的脱离开发环境而启动运行的方式来生成程序最终的执行代码。

生成程序是指将源码(C++语句)转换成一个可以运行的应用程序的过程。如果程序的编写是正确的,那么通常只需按一个功能键,即可搞定这个过程。该过程实际上分成两个步骤。

第一步是对程序进行编译,这需要用到编译器(compiler)。编译器将C++语句转换成机器码(也称为目标码);如果这个步骤成功,下一步就是对程序进行链接,这需要用到链接器(linker)。链接器将编译获得机器码与C++库中的代码进行合并。

⑻ c++的一个自己设立的函数 返回临时变量时 编译器都做了什么,比如传值调用,编译器会生成一个变量的副本

编译器在函数运行到函数内部的时候给变量分配了内存,但函数结束后此变量就被系统销毁了,函数要返回此变量的值存在缓冲区中。

⑼ C++编译器如何解析函数

这个过程是一个相当复杂的过程。以一个简单的函数为例子。int max(int x,int y)。这个函数求两个变量当中的较大值,在执行的时候首先将参数y,x的值入栈。入栈之后开始执行函数体当中的代码。当执行到return语句的时候,会将计算的结果保存在eax寄存器当中,调用该函数的地方从这个地方读取值。具体的内容可以参考《程序员的自我修养》的后部分。

⑽ 程序的编译链接过程

stdio.h 只是一个函数声明的头文件, 实现在已经编译好的库文件中,一般情况 IDE 会自动连接标准库,不需要你管。

热点内容
php开发的网页 发布:2025-05-14 16:22:03 浏览:477
服务器内存跑满了怎么回事 发布:2025-05-14 16:21:16 浏览:223
微信qq音乐缓存 发布:2025-05-14 16:16:16 浏览:468
c语言回收内存 发布:2025-05-14 16:16:08 浏览:143
2021国产安卓顶级旗舰买哪个 发布:2025-05-14 16:15:36 浏览:300
linux自学视频 发布:2025-05-14 16:14:49 浏览:255
我的世界服务器崩了重启 发布:2025-05-14 16:09:37 浏览:44
android深拷贝 发布:2025-05-14 16:09:35 浏览:153
cf电脑版转服务器神器还在吗 发布:2025-05-14 16:09:02 浏览:211
百度文库服务器如何搭建 发布:2025-05-14 16:09:00 浏览:248