总结一下印象深刻的一些点,基本都是我答不上来的。
腾讯
岗位:渲染引擎开发
天美实习
投的校招,被捞成了实习,面到HR面,说你不来实习没法发offer,气死。
- 死锁
- 数字在计算机中怎么存储?补码
- 碎片,虚拟内存
- 智能指针具体用法,注意事项
- move构造,有什么意义?
- 函数参数为什么从右往左入栈?
- lambda函数底层实现
天美校招一
一面,挂了。
-
结构体数组和数组结构体,是什么?哪个效率高?
没找到具体说法。效率高要看干什么? -
static_cast和reinterpret_cast的区别?
static_cast是一种从一种类型到另一种类型的转换,(直观地)是一种转换,在某些情况下可以成功,并且在没有危险转换的情况下是有意义的转换。例如,可以从void* 到int*,因为void* 实际上可能指向int* 或int到char,因为这种转换是有意义的。但是,您不能将static_cast和int* 转换为double*,因为只有当int* 被某种方式损坏而指向double* 时,这种转换才有意义。reinterpret_cast是一个表示不安全转换的强制转换,它可以将一个值的位重新解释为另一个值的位。例如,将int* 强制转换为double* 对于reinterpret_cast是合法的,尽管结果未指明。同样,将int铸造到void* 是完全合法的,尽管它是不安全的。
-
堆区和栈区变量创建和释放对象哪个更快?为什么?
访问堆的具体单元组要两次访问内存,第一次取得指针,第二次取数据。而栈只需要一次。另外,堆的内容被操作系统交换到外存的概率大。 -
三个单位向量,满足 a + b + c = 0 a+b+c=0 a+b+c=0,求 a ⋅ b + b ⋅ c + c ⋅ a = ? a·b + b·c + c·a = ? a⋅b+b⋅c+c⋅a=?
(a+b+c)*a=0
(a+b+c)*b=0
(a+b+c)*c=0
三个式子相加再除2得 a·b+a·c+b·c+3/2=0
则a·b+a·c+b·c=-3/2 -
extern 有啥用?
天美校招二
一面
这次面试官人超好,一直在引导。
- 内存堆和栈?函数调用入栈?
#include <stdio.h>
char* function1()
{
char* string = "Hello, World!";
return string;
}
char* function2()
{
char string[] = "Hello, World!";
return string;
}
int main()
{
char* foo1 = function1();
printf("%s\n", foo1);
printf("------------\n");
char* foo2 = function2();
printf("%s\n", foo2);
return 0;
}
两个输出结果是什么?
function1正常输出,因为 "Hello, World!"存储于字符区,指针指向字符区的存储,函数结束不会被释放,所以正常输出。
function2中的字符是局部变量,存储于栈上,函数结束被释放,foo2指向被释放的区域。
- 多态怎么实现
- 看代码
class A
{
public:
void function(){printf("Hello World");}
};
……
A* p1 = NULL;
p1->function();
……
class B
{
public:
virtual void function(){printf("Hello World");}
};
……
B* p1 = NULL;
p1->function();
class C
{
public:
void function(){m_a = 0; printf("Hello World");}
private:
short m_b;
int m_a;
};
……
C* p1 = NULL;
p1->function();
class D
{
public:
void function(){m_a = 0; printf("Hello World");}
private:
static int m_a;
};
……
D* p1 = NULL;
p1->function();
首先明确一点,类的对象为空指针,可以调用类的函数,只要函数中没有使用到this指针。虽然需要传递隐式指针,但是函数体中并没有使用到这个隐式指针,也就是说没有通过这个隐式指针去使用非静态的成员变量,所以对象为空也不影响对函数的正常调用。
因此A可以正常输出。
B对象没有虚函数指针,所以报错,无法正常运行。
C中函数调用了变量,需要使用this指针去调用,因此报错。
D中调用static变量,可以正常输出。
还问了上面四个类占的内存大小,注意空类大小(不含成员函数的类)为1。
- vector和list的区别
- hash表的实现原理,冲突怎么办?
- 怎么预防内存泄漏?
- 使用过什么设计模式?
两道算法题
- 给定一个只包含 “()[]{}” 六种字符的字符串。规定它们的优先级由外至内为:"{}", “[]”,"()",同一级的可以嵌套,并列。要求判断给定的字符串是否是合法的括号字串? 例:"()", “{((()())())[()]}()” 是合法的。"())", “([])”, “())(()” 都是不合法的。
- 二叉树中序和后序遍历构建树。
其他
- 输出是 ABCD
#include <stdio.h>
#include <iostream>
using namespace std;
class A{
public:
int _a;
A(int a): _a(a){cout<<"A";}
};
class B:public virtual A{
public:
int _b;
B(int a, int b):A(a), _b(b){cout <<"B";}
};
class C:public virtual A{
public:
int _c;
C(int a, int c):A(a), _c(c){cout <<"C";}
};
class D: public virtual B, public C{
public:
int _d;
D(int a, int b, int c, int d):A(a), C(a,c), B(a, b), _d(d){cout <<"D";}
};
int main()
{
D x = D(1,2,3,4);
return 0;
}