京东一面(搜索部门-C++):2017-08-17

2017-08-19 00:50 阅读 1,047 次 评论 0 条

实现一个memcpy,效率尽可能高?

memcpy所做的操作时把内存中的一块数据复制到内存的另一个地方,也就是内存到内存的数据拷贝,这个过程需要CPU的参与,即:先从内存取数据到寄存器,再从寄存器写到内存中,可以使用下列C代码实现:

上述情况当count较小时,尚且可以应付,倘若count很大,这种逐个字节拷贝的方式效率太低了。实际上,memcpy是效率最高的内存拷贝函数,在内存未对齐的情况下它的确是一个字节一个字节拷贝,但是,如果地址对齐之后,它会使用CPU的字长进行拷贝,还会根据CPU的类型来选择一些优化的指令进行拷贝,因此说memcpy是最快的内存拷贝函数是实至名归的。

100万有序数据,是否存在两数之和等于给定值?

我的思路是定义一个首尾指针,大于指定值end--,小于指定值begin++,也可以加上二分思想优化之,不过这肯定不是最优解,如果你恰好看到这题,可以交流一下。

求巨大数组的前K大的数?

topK问题分析、CVTE topK问题

class里如何给引用类型成员初始化?

类中有引用类型、常量类型的成员变量时,不能有缺省的构造函数,默认构造函数没有对引用成员提供默认的初始化机制,也因此造成了引用未初始化的编译错误。所以在创建的时候就应初始化,也就是在构造函数的初始化列表中。

C malloc出来的内存,可以调用delete释放吗,为什么?

可以。当使用delete的时候有两件事情要做:第一,针对此内存会有一个或者多个析构函数被调用。第二,内存才被释放,即:delete = detructor + free。

但是new和free搭配是不行的,使用new的时候有两件事情发生:第一,内存被分配出来。第二,针对此内存会有一个或者多个构造函数被调用。然而free仅仅是释放内存,而没有对对象进行析构,可能因为对象清理不干净而导致内存泄漏。

注意:将malloc和delete与new和free混用是一个坏想法,对一个用malloc获取的指针调用delete,或者对一个用new获取来的指针调用free,其后果是不可预测的,我们应该避免这种情况。

下面程序输出是什么,为什么?

答案:hello world。之所以不会奔溃的原因在于,print函数是一个非虚函数,它是静态绑定的,编译器会根据对象的静态类型来选择函数,p的静态类型时A*,那么编译器在处理p->print()时会将向它指向A::print(),p的首地址为NULL,虽然编译器会给该函数传递this指针,this指向p的首地址,但是由于该函数没有通过this指针来访问类的成员函数,即没有对this指针解引用,因此会正常运行。

而如果我们在print函数前面加一个virtual,它就变成了动态绑定,主要依靠虚表来实现,虚表中存放类的虚函数的地址,通过对象调用该虚函数时,会通过虚表查找真正要调用的函数的入口地址,如果对象p为NULL,则无法找到虚函数表,此时就会奔溃。

简述一个简单的C/S通信程序的实现步骤?

下面是基于TCP协议的socket通信:

简述linux进程的内存布局?

上篇已经对Linux下进程的内存布局有了简要描述,如果你感兴趣,这里有一篇文章更加深入Linux进程地址空间 && 进程内存布局

两个线程共享一个整形变量,一个++,一个--,最后输出这个变量,如何最大程序的提高并发能力?

首先应该明确++与--都非原子操作,它们的汇编指令是有三条的。我能想到最合适的方法就是加锁,我们可以使用mutex锁将++操作放入临界区内,在同一时刻只有获得锁的线程才能访问临界区,保证了++的原子性,--同理。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:京东一面(搜索部门-C++):2017-08-17 | 术与道的分享
分类:笔经面经 标签:, , ,
1024do.com导航_术与道导航平台

发表评论


表情