8月柯达面试题详解()——转

时间:2021-02-10 14:57:52 综合指导 我要投稿

2007年8月柯达面试题详解(精华)——转

  一个朋友参加柯达的面试,被几个问题郁闷了,回来整理一下,巩固一下基础知识,顺便分享给大家,下次可不能再让面试官给难住了 
系统调用与函数的区别 
  从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务,函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。函数库的函数,尤其与输入输出相关的函数,大多必须通过Linux的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用。这样程序员可以只要写一次代码就能够在不同版本的linux系统间使用积压种具体实现完全不同的系统调用。至于如何实现对不同的系统调用的兼容性问题,那是函数库开发者所关心的问题。 
  从程序执行效率来看,系统调用的执行效率大多要比函数高,尤其是处理输入输出的函数。当处理的数据量比较小时,函数库的函数执行效率可能比较好,因为函数库的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高,但是在进行系统调用时,因为用户进程从用户模式进入系统核心模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。但是当要处理的数据量比较大时,例如当输入输出的数据量超过文件系统定义的尽寸时,利用系统调用可获得较高的效率。 
  从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C) 具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。 
可重入函数概念: 主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。 
  也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的'是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。 说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。 堆和栈的区别 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 在什么情况下析构函数必须是虚函数若类中有虚函数,这个类的析构函数应该是虚的析构函数,否则会有错假设夫类为a,子类为b,当a* p = new b();要析构p指向的对象时,若a中的析构函数不是virtual则调用delete p时,不会调用b的析构函数,这样在b中分配的资源就无法释放了。你可以在a和b的析构函数中输出看一下,或者用调试工具跟踪看一下 在全局变量和全局静态变量有什么区别变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 
  按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。 
  按作用域分,全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 
  全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。静态全局变量,只本文件可以用。全局变量是没有定义存储类型的外部变量,其作用域是从定义点到程序结束.省略了存储类型符,系统将默认为是自动型. 
  静态全局变量是定义存储类型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的, 它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存.自动型变量存放在堆栈区中.堆栈区也是内存中一部分,该部分内存在程序运行中是重复使用的.声明变量与定义变量有什么区别声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。在C和C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为ODR,单一定义规则)。。。 
  定义也可以是声明,如果有int x;,之前编译器未发现标识符x,编译器则把这一标识符看成是定义并立即为它分配存储空间。 。。。。。 对“变量声明”的解释向来模糊且自相矛盾。。。 函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如int a;但这产生了一个矛盾,这段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于C和C++需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是extern,它表示变量是在文件以外定义的,或在文件后面定义的。 
  在变量定义前加extern表示声明一个变量但不定义它,如: extern int a; extern也可用于函数声明,如: extern int func1(int length,int width); 但由于没有函数体,编译器必把它当成声明而非定义,extern对于函数来说是多余的、可选的。C语言的设计者并不要求函数声明使用extern,这可能有些令人遗憾,如果函数声明也要求用extern,那么形式上与变量声明更加一致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用extern的原因)。。。 什么是字节对齐,为什么要对齐? 
  现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 
  对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。

【2007年8月柯达面试题详解(精华)——转】相关文章:

华为硬件面试题03-11

求职英语面试题集锦03-11

银行招聘英语面试题04-03

经典面试题回答思路03-17

2016详解公积金缴费基数03-11

韦博英语面试题目06-27

英语教师面试题及答案03-20

苹果公司英文面试题03-20

空乘英语面试题目03-20

图像处理的笔试面试题03-09