C 音视频开发 面试1
技能要求:Socket,MFC,Windows
岗位职责: 1、参与需求分析、模块开发等相关工作; 2、在windows平台下进行C/C 应用程序设计、开发、测试; 3、参与软件系统或模块的联调,协助测试人员进行软件测试,修复BUG; 4、参与编写相关技术文档。 任职要求: (1)统招本科及以上毕业,计算机相关专业毕业,3年以上C 研发工作经验; (2)熟悉Windows操作系统,精通C/C 、面向对象软件设计,熟悉多线程控制及MFC界面编程等; (3)有大型C/C 服务器研发经验优先,熟悉TCP/IP协议; (4)具备通信基础知识、有音视频系统相关开发经验优先; (5)具有良好的编程习惯,积极沟通反馈,善于团队协作。
C 笔试题
1、MFC指的什么?
代码语言:javascript复制Microsoft Foundation Class
2、SendMessage和PostMessage区别?
代码语言:javascript复制1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。
2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。 如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。
3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.
如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。 最好不要用PostMessage发送带有指针参数的消息。
3、MFC的对话框的种类,各自怎么使用?及相关函数
4、自定义一个Windows消息的发送与响应,有哪些步骤?
5、在MFC窗口中制作一个逃跑按钮(鼠标永远捕捉不到),该如何实现?
代码语言:javascript复制方法一:
创建一个类MyButton, 让该类从CButton类派生
在该子类中处理鼠标移动事件, 鼠标移动到该按钮上, 计算随机位置, 移动按钮
在窗口中拖放一个CButton按钮, 给该按钮关联一个MyButton类型的变量, 即可。
方法二:
设置鼠标WM_MOUSEMOVE的响应函数用于捕获鼠标移动操作,每当鼠标移动到btn上就修改属性隐藏,同时修改另一个btn的属性为显示,造成btn自动“逃跑”的假象。
具体可以参考:[MFC学习——“逃跑”按钮的实现](https://blog.csdn.net/sinat_20265495/article/details/51232045)
6、MFC中文档视图结构中都需要哪些类?
代码语言:javascript复制文档视图结构中有如下类:
(1)、文档类
(2)、视图类
(3)、框架类
(4)、应用程序类
在MFC框架的任何位置都可以访问窗口框架类: AfxGetMainWnd()
在MFC框架的任何位置都可以访问应用程序类: AfxGetApp()
视图类中访问关联的文档类: GetDocument()
框架类中访问文档类: GetActiveDocument()
框架类中访问视图类: GetActiveView()
7、音频信号压缩标准的编码主要有哪些?
代码语言:javascript复制aac MP3 ape flac
8、经采样、编码但未压缩的语音信号(对应G.711编码)是什么数据?
9、常见的数字音频编码文件格式有哪些,并简述其特点。
10、如何从H264码流中获取视频的分辨率大小?
11、H264码流中I帧,P帧,B帧的区别是什么?
代码语言:javascript复制 I帧是关键帧,帧内编码帧
P帧是前向预测编码帧
B帧是双向预测内插编码帧
12、回答下面的问题。
(1)、引用与指针的区别是什么?
代码语言:javascript复制指针和引用都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
程序为指针变量分配内存区域,而不为引用分配内存区域。
指针使用时要在前加 * ,引用可以直接使用。
引用在定义时就被初始化,之后无法改变;指针可以发生改变。 即引用的对象不能改变,指针的对象可以改变。
没有空引用,但有空指针。这使得使用引用的代码效率比使用指针的更高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
对引用使用“sizeof”得到的是变量的大小,对指针使用“sizeof”得到的是变量的地址的大小。
理论上指针的级数没有限制,但引用只有一级。即不存在引用的引用,但可以有指针的指针。
int **p //合法
int &&p //非法
引用与 指针的效果不一样。
例如就 操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。
(2)、构造函数和析构函数是否可以被重载,为什么?
代码语言:javascript复制构造函数可以被重载,因为构造函数可以有多个且可以带参数。
析构函数不可以被重载,因为析构函数只能有一个,且不能带参数。
13、以下为 WindowsNT下的32位C 程序,请计算 sizeof的值 vold Func( char str[1001) sIzeof( str)=? d*kp= malloc( 100) sizeof( p)=?
代码语言:javascript复制sIzeof( str)=4
sizeof( p)=4
14、编写 strcat函数 已知 strcat函数的原型是char* strcat(char* strDest,const char* strSrc) 其中 strDest是目的字符串, strss是源字符串。 不调用C /C的字符串库函数,请编写函数 strcat
15、写一个函数找出一个整数数组中,第二大的数。 大概思路:先对整数数组按照升序进行排序,然后返回下标为1的第二大的数。
代码语言:javascript复制
面试
1、对MFC熟悉么?写过复杂的界面没有?还有文档视图使用的多不?
2、使用过哪些VC 中的线程同步?
3、VC 中网络模型熟悉不?比如说完成端口、重叠IO
C 技术面试2
1、模板的主要用途和实现机理是什么?
2、STL vector是怎么实现的,内部原理是什么?
3、你觉得你是一个什么样的人?
(1)、对技术钻研比较深入,不太在于工资,对技术很狂热。
(2)、做工资就是看工资,不在乎使用什么技术,只要赚钱就行。
4、你的未来职业规划是什么?
5、Modbus协议的原理和内部机制、分类等
6、TCP和UDP的区别?
7、Boost库熟悉哪些?
8、C 11熟悉么?
auto、lambda表达式,
右值引用熟悉么?完美转发熟悉么?
9、STL标准库熟悉么?熟悉哪些容器和算法?
10、多线程熟悉么?多线程一般需要注意哪些问题?你使用到哪些锁?mutex、读写锁,unique_lock用过没?
11、进程间通信使用过哪一些?
信号量、共享内存、油槽
12、对QT、MFC熟悉么?
C 面试3
1、WebSocket和Socket有什么区别?
2、对高并发熟悉么?你们做的TCP Server并发量高么?
3、你最近的一份工作中遇到的一个难点和问题是什么?你是怎么解决的?
4、你在你们项目中负责什么?担任什么角色?
5、Boost库中为什么大量使用hpp文件?基于什么考虑?
Boost库的头文件与我们平常所用的头文件(*.h)或者C 标准库头文件(没有后缀名)不同,它是把C 类的声明和实现放在了一个叫做.hpp文件中。之所以这么做,一是与普通C头文件区分开,还有一个重要的原因是使Boost库不需要预先编译,可以直接引入程序员的工程即可编译链接,方便库的使用。最后有一个原因就是C 编译器的限制,许多编译器还不支持C 标准提出的模板分离编译模式(export关键字),而Boost库大量使用了模板,为了保持与各个编译器的兼容,也不得不采用这种.hpp的头文件形式。
6、模板的实现可以写在.h文件中吗?
7、C 模板类代码只能写在头文件?
这个问题,实际上我几年前就遇到了。最近写个模板类玩的时候,再次遇到。
当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过。但是当使用的时候,就会报告所有的函数调用都没有实现。按常规.h/.cpp而言这是不可能的。但是模板类就是这么独特。简单说说他的原因,也备自己将来遗忘:
从语法角度而言,是没有强制要求说模板代码的声明和实现不可以分开。那么当分离的声明和实现写好后,单独编译.cpp是可以通过的,但是生成的.o文件却非常小,只有一个原因:确实没有任何实现代码!————不知道用什么类型参数套用模板。
因为模板类需要在使用到的地方利用声明模板的typename或者class参数的时候,才会即时生成代码。那么当我把模板声明和实现分开的时候,这个即时过程因为编译器只能通过代码include“看到”头文件而找不到模板实现代码,所以会产生链接问题。这也是为什么几乎都会建议模板类和声明和实现都写在头文件。
如果刚接触c/c 编写的朋友可能还不是很明白。编译器面对巨量代码的时候,也是以一个一个的.cpp/.c文件作为基本单元,根据代码的include包含找到声明,翻译代码产生.o文件。注意他们每个cpp/c文件都是相互独立完成自己工作的,对于缺少的部分,如果妥善声明,会留待链接过程的时候产生引用关系。 那么刚才说的模板类实现代码,编译它的时候因为不知道套用什么参数,实际上没有任何有用的内容存在于.o文件当中。而在使用模板类的地方指定了类型参数,编译器这才开始根据模板代码产生有用的.o编码,可是这些内容放在了使用模板的代码产生的.o文件当中。如果编使用模板代码的时候,通过include包含“看不到”模板的实现代码,这些所有的缺失,到链接阶段就无法完成。
所以最后的结论是:请老老实实把模板的实现和声明都写在头文件吧。如果你很有想法有个性,可以坚持,然后试试#include “xxxx.cpp” 这样屌炸的代码。
Qt C 面试4
1、谈谈Qt的信号-槽的实现机理
信号-槽是一种对象之间的通信机制,是Qt在标准C 之外,使用元对象编译器(MOC)实现的语法糖
2、对23种常见的设计模式熟悉哪些?
观察者模式、单例模式、工厂模式、状态模式
3、Boost库中的Singal2信号-槽和Qt中的信号-槽有什么区别?
4、Qt中多线程中槽函数是怎么调用的,调用的时机是什么?
Qt中 QThread 实现线程有几种方式?
5、在信号-槽中是怎么传递自定义结构体的?
QT信号槽收发自定义类/自定义结构体的2种方法
想要发射信号时,携带自定义的class或者struct,必须要做一下处理,否则编译时不会报错,但运行时会出错。
假设我们自定义了一个结构体:
typedef struct { …// …// }Frame7E; 如果想要这么用:
Frame7E frame; …//填充frame emit sendFrame(frame); 那么必须使用以下两种方法之一。
方法1:使用宏:Q_DECLARE_METATYPE
该方法的原理是使得QVariant类支持我们自定义的类型,而QT的信号槽是支持发射QVariant类型数据的,然后我们可以用QVariant封装这个自定义类/结构,然后emit 出去QVariant类型的变量。
#include <qmetatype.h> //发射端 Frame7E frame; …//填充frame QVariant var; var.setValue(frame); // copy s into the variant emit sendFrame(var);//发QVariant类型的信号
接收端 // retrieve the value Frame7E s2 = var.value();//QVariant 转换为 Frame7E 方法2:使用qRegisterMetaType函数使得QT的信号槽支持自定义类型
参考:https://blog.csdn.net/xbnlkdbxl/article/details/56842565
#include
//注册自定义类型,使QT的信号槽支持我们的类型 qRegisterMetaType(“Frame7E”);//参数无所谓,建议带上同名字符串参数 注册完之后,就可以正常使用信号槽了。
需要注意以下几点:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册; 2、注册方法:在当前类的顶部包含:#include ,构造函数中加入代码:qRegisterMetaType(“Myclass”); 3、Myclass的引用类型需单独注册:qRegisterMetaType(“Myclass&”);
8、Windows进程间通信的方式有哪些?
9、WebSocket和Socket有什么区别?
10、谈谈Qt的DBus
C 面试5
1、STL vector做大量push_back操作时会出现什么问题?
2、boost库 指针的原理,怎么做到动态分配内存不delete?
3、模板你在项目中使用的多吗?
C 面试6
1、派生类怎么调用基类的虚函数版本?
C primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
也就是说:
当你实现派生类B的虚函数B::foo()时,如果函数体内需要调用基类的虚函数版本时,需要显示使用基类A的作用域操作符A::foo(),否则foo()就会在派生类作用域调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了。
代码语言:javascript复制struct A
{
virtual void foo(void) { }
}
struct B: public A
{
void foo(void)
{
foo(); // 递归调用自己,即 B::foo()
A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己
}
}
2、STL map:erase删除元素之后迭代器失效的问题
当删除map迭代器中的某个元素时,会出现迭代器失效,该如何安全的解决处理?
3、智能指针了解么?
shared_ptr、unique_ptr、weak_ptr、scope_ptr有什么区别
4、面向对象:虚函数和纯虚函数有什么区别?
5、如何保证访问STL容器比如vector、map、set线程安全?读写前后加锁处理
6、单例模式
指针: 会出现多线程访问的new多个对象的问题
static 成员变量:所有类都使用同一个对象
7、你目前这份工作解决的最大难题是什么,谈谈你是怎么解决的?
C 面试7
1、二级指针 指针的指针一般用来做什么?
2、动态数组使用C语言怎么实现?
3、对Linux熟悉吗?
4、进程和线程有什么区别?线程间的数据可以共享么?
5、TCP和UDP的有什么区别?
TCP服务端、客户端的实现流程一般是什么样的?
UDP需要建立连接么?
6、信号量一般怎么使用,熟悉么?
7、C语言或者C 中static关键字的作用?
代码语言:javascript复制1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
2. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员。
8、protobuf协议有使用过么?
9、xml熟悉么?xpath是什么?
10、怎么让一个类只有一个唯一对象?