2021秋招面试记录


总结一下印象深刻的一些点,基本都是我答不上来的。

腾讯

岗位:渲染引擎开发

天美实习

投的校招,被捞成了实习,面到HR面,说你不来实习没法发offer,气死。

  1. 死锁
  2. 数字在计算机中怎么存储?补码
  3. 碎片,虚拟内存
  4. 智能指针具体用法,注意事项
  5. move构造,有什么意义?
  6. 函数参数为什么从右往左入栈?
  7. lambda函数底层实现

天美校招一

一面,挂了。

  1. 结构体数组和数组结构体,是什么?哪个效率高?
    没找到具体说法。效率高要看干什么?

  2. 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* 是完全合法的,尽管它是不安全的。

  3. 堆区和栈区变量创建和释放对象哪个更快?为什么?
    访问堆的具体单元组要两次访问内存,第一次取得指针,第二次取数据。而栈只需要一次。另外,堆的内容被操作系统交换到外存的概率大。

  4. 三个单位向量,满足 a + b + c = 0 a+b+c=0 a+b+c=0,求 a ⋅ b + b ⋅ c + c ⋅ a = ? a·b + b·c + c·a = ? ab+bc+ca=?
    (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

  5. extern 有啥用?

天美校招二

一面
这次面试官人超好,一直在引导。

  1. 内存堆和栈?函数调用入栈?
#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指向被释放的区域。

  1. 多态怎么实现
  2. 看代码
	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。

  1. vector和list的区别
  2. hash表的实现原理,冲突怎么办?
  3. 怎么预防内存泄漏?
  4. 使用过什么设计模式?

两道算法题

  1. 给定一个只包含 “()[]{}” 六种字符的字符串。规定它们的优先级由外至内为:"{}", “[]”,"()",同一级的可以嵌套,并列。要求判断给定的字符串是否是合法的括号字串? 例:"()", “{((()())())[()]}()” 是合法的。"())", “([])”, “())(()” 都是不合法的。
  2. 二叉树中序和后序遍历构建树。

其他

  1. 输出是 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;
	}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值