主页 > 焦点科技 >空港快捷酒店_为什么C语言的速度没有汇编快?C执行的时候不是编译成了机器码(exe)才执行的吗?跟汇编有差距吗? >

空港快捷酒店_为什么C语言的速度没有汇编快?C执行的时候不是编译成了机器码(exe)才执行的吗?跟汇编有差距吗?

为什么C语言的速度没有汇编快?C执行的时候不是编译成了机器码(exe)才执行的吗?跟汇编有差距吗?
c的底层由汇编实现,所有会有重复的地方,用汇编写程序直达目的,所以同样的功能,c语言会产生更多的代码追问

c和汇编写的代码最终不都是要编译成同样的机器码执行吗?追答

c生成的机器码更多,相同的功能,代码多了速度也就慢了追问

我认为这是编译器的问题,编程语言跟我们说话一样。机器码就是我们最终想要表达的意思,表达的含义只有一个。但是c生成的代码更多说明,翻译的时候翻译的不够精确。如果编译器是理想状态下,应该不会有这个问题了吧。追答

你说的很对,但事实上却做不到,机器并不是人,不知道我们要表达的意思,c的函数每一个都有它的作用,程序员将函数组合成程序,但是写编译器的人不可能知道其他程序员要怎么使用这个函数,不知道会怎么组合,所以c语言需要的只是完成某个函数,包括安全性等各个方面,重复不可避免
例如 指针的安全性检测,写编译器的人不可能知道函数会这样组合,所以不知道该怎么检测,何时指针的安全性,为了安全又不得不检测,所以在需要的时候就检测,甚至每个函数都检测,因为有可能该指针在其他函数里被改变
从php到ipcode到机器码,这个过程php有转换成c语言吗,说它是用c实现的


  1.PHP是做网页开发般不接触底层的东西。C一般做嵌入式开发要知道一些如操作,嵌入式硬件的知识。
  2.C语言是很多东西都要你自己实现,比如说动态数组,排序,查找,字典,字符串,内存,很多东西要是没有一定的算法功底和对计算机原理有一定了解的话是弄不出来的;而php是比较高层的语言,很多东西,例如上面所说的系统都已经帮你做了,例如一个简单的在一个字符串里查找某个字串,用c来写的话可能需要一大段代码,而php就是一个函数直接用就行,而且不用考虑资源释放。php带了一些比较丰富的库,开发中的大部分问题都可轻易解决,而c就没那么容易。PHP底层zend引擎是c语言写的
如何将c源代码转换成机器码?
首,你一定有一个用C语言编的源程序,编译通过后一定生成了一个.EXE对不对.
然后你要进入DEBUG,这个一般在系里有(一般是C盘)
如果这些都有的话才能看机器代码:
进入系统,输入,c:>debugaaa.exe
回车,然后输入U就可以了,
(aaa.exe是你的C语言生成的一个可执行文件)用编译器编译后产生的扩展名为obj的文件就是。
C语言哪些函数语句的机器码会存储在内存中?
自然不会,每一个变量(包括函数)都己的周期,程序结束后释放所内存,程序运行时只有被声明为inline内联函数,或者正在被调用的函数(也就是你上面收提及的第一种情况)存储在内存中(栈区),调用完毕后立即释放内存。
回答完毕,祝楼主学习进步。你的内存装的下就会存在内存中,cpu再从内存中去取(准确说是有多级缓存,越快的缓存,空间越小,价格也更高),如果内存不够的话,会存在硬盘中,用时再去取,当然内存中取的速度要比硬盘中取快得多。不会。C是用一次执行一次,不用时释放。不过你的变量得都是临时变量才不会占多余空间,如果是指针就保存到你指向的变量;如果是全局变量的话一开始就会占空间。追问

我说的是指令会不会存到内存中,不是变量存储追答

C一般来讲,程序不是很大的时候,程序的代码肯定都会装载到内存中,除非是程序大到没法全部装入操作系统给其分配的空间的时候,就会有一部分存在外存,用的时候替换进去没函数在代码段,会被加载存,调用函数时,通过call指令跳转数所在的内存执行函数。
对代码用OD调试、反汇编,可以看到函数所在的内存地址。

对于Windows下,一般可执行文件是以PE格式存在的。如果对加载细节感兴趣,搜索“PE文件格式详解”。你这个问题回答起来复杂。首先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)来自:求助得到的回答


上一篇: 下一篇: