快手C++一二面(offer)
快手的面试来得很迷。一开始我投的C++岗位,测评和笔试都做了,而且笔试还a了两道多,但是后来官网上显示“不合适”。简历挂,好伤心,所以在官网又投了一次,不过是有另一个部门的C++岗位。某天hr打电话给我约面试时间,我当时有点懵。这都有面试机会?这都行?疑惑?哈哈哈,可能是人品爆发了吧。
实习一面
自我介绍
介绍C++内存配置器
调用
malloc
的时候要求 8 bytes 内存对齐,怎么处理?实现
lower_bound
虚函数相关
class A { virtual void foo() = 0; }; class B : public A{ };
sizeof(A)
在 32 位的机器上会出现什么问题?- 使用
class B
的话,后续可能会出现什么问题?(析构函数不是虚函数) - 编译器为
class B
生成了哪些函数?有右值版本的函数吗?
static
的作用,下面例子合法吗?// a.cpp static int a = 0; // b.cpp extern int a;
const_cast
的作用下面例子中,
std::move
失效的情况,即没有调用右值版本的push_back()
。(A是内置类型或者A没有右值版本的拷贝构造函数)vector<A> a; a.push_back(A());
介绍智能指针
几何题:3d空间中一点到一条直线的距离?
实习二面
自我介绍
看到我学过前端,所以开局是一道JavaScript的题。(被问懵了,我记得我投的是C++岗呀)
// 解释 this 的指向 this.a = 10; function XXX(){ this.a = 100; } var xx = new XXX()
下面代码的输出是:
#include <string> #include <iostream> using namespace std; int main() { { std::string s = "1234"; cout << s << endl; // "1234" } { std::string s = "1234"; std::move(s); cout << s << endl; // "1234" } { std::string s = "1234"; const auto& s1 = std::move(s); cout << s << ' ' << s1 << endl; // "1234 1234" } { std::string s = "1234"; auto&& s1 = std::move(s); cout << s << ' ' << s1 << endl; // "1234 1234" } { std::string s = "1234"; auto s1 = std::move(s); cout << s << ' ' << s1 << endl; // " 1234" } return 0; }
下面代码会出现什么问题?
- 面试的时候答了字符串是局部变量,会被销毁。但是面完之后,细想觉得回答错了。
"123"
是字面量、常量,存储在常量区,应该不会被销毁。请问我的思路对吗?请指点指点!
#include <iostream> #include <string> std::string getString() { return "123"; } int main() { const char* s = getString().c_str(); std::cout << s << std::endl; // "123" return 0; }
- 面试的时候答了字符串是局部变量,会被销毁。但是面完之后,细想觉得回答错了。
使用 sort 函数对 vec 按 index 大小进行从小到大的排序。其中的比较函数只是判断了小于的情况,但是 sort 函数怎么判断相等的情况?
struct S { int index; float data; }; std::vector<S> vec0 = { {0,1}, {0,2} };
怎么让一个类获取到自己的
shared_ptr
?主要考察enable_shared_from_this
,我忘了怎么使用了,所以就没要求继续做题目。写一个函数, 对于所有基本类型, 直接使用 std::cout 输出,对于 std::string 输出它的长度。
// 实现一 // 一开始使用特化版本实现 template <class T> void print(const T& val) { std::cout << val << std::endl; } template <> void print(const string& val) { std::cout << val.size() << std::endl; } // 实现二 // 一开始没听清,面试官一开始提示用 type_traits 可以实现, // 特化的实现写完之后,面试官继续提示 is_same template <class T> void print(const T& val) { if (std::is_same<T, std::string>::value) { std::cout << val.size() << std::endl; } else { std::cout << val << std::endl; } }
实现一个函数, 找到数组的最大值和第二大的值。
实现一个函数,找到里面出现次数最多和第二多的两个数,其中数组类型为
vector<unsigned short>
。大数相加:实现一个函数, 输出两个字符串数值相加的结果。
提问环节
总结
一早上连续面了两面,二面面了一个半小时,好累。佩服那些连续三面的同学。
隔了一周,hr打电话过来直接沟通offer了,没有hr面。我看牛客上,大家都有hr面,甚至有的同学还有第三轮技术面,所以我觉得这次面试有点迷,运气也太好了,感觉像捡了一个offer。
基本上都是问C++基础的面试风格还是第一次碰到,自我感觉表现还行。面试过程中也发现也几个C++基础理解上的问题,所以收获还是蛮大的。
#快手科技##快手##面经##C++工程师##实习#