快手 编译器研发 一二面面经

3.29一面(50分钟)

  • 项目经历
  • 编译过程
  • PGO优化相关
  • 看代码说运行结果:
  • 修改字符串常量
  • 报错吗?
  • 为什么
  • 1号线程x=1,done=1。 2号线程while(done == 0) { /* loop */ }done = 1; print(x);
  • 输出结果是什么
  • 为什么
  • p = malloc(8)
  • 这段代码做了什么
  • 能申请多少空间
  • 释放的过程怎么知道释放多少空间
  • TLB
  • 全称和英文是什么
  • 有什么用
  • 手撕
  • 最长上升子序列(5分钟)
  • 解释
  • 刚刚哪里卡了一下

4.8一面(1小时20分钟)

聊项目(50分钟)

  • 介绍项目并反问
  • PGO优化
  • BOLT优化
  • 编译时间很长怎么办

聊八股(30分钟)

  1. struct在C和C++里的异同
  2. c语言里的struct定义,有办法不带struct关键字吗
  3. 数组和指针区别
  4. 写一个常量指针和指针常量例子
  5. 将0x1234赋值给int型,如何char*指向刚刚的地址,分别输出 (int)*p,(int)*(p+1),(int)*(p+2)。说一下代码输出内容,为什么?假设在64位小端机器上
  6. C++虚函数的作用和原理,写一个例子,另外说一下对纯虚函数的理解
  7. memcpy原理与实现

总结

面试官都很好,有引导,但就是自己太紧张了,有点懵,有几题很简单的没回答出来,结束了瘫在椅子上两三分钟也就想明白了。复盘的时候感觉面试官已经在尽力抢救我了。二面的面试官:“你的项目经历很不错,你这基础不太行”。感觉这是离成功最近的一次了,着实可惜。 二面完一周后官网上流程结束。

全部评论
编译器开发,听着都害怕😥
1 回复 分享
发布于 05-13 14:01 上海
快手的编译器开发是做什么业务的?挺好奇
点赞 回复 分享
发布于 05-13 14:11 江苏
是春招吗佬
点赞 回复 分享
发布于 05-27 21:35 天津

相关推荐

1. std::vector的insert()与push_back()的区别是什么?2. unique_ptr底层是如何实现资源管理的?3. C++中的重载与覆盖的原理是什么?4. 一个类的默认构造函数中会包含哪些内容?5. virtual关键字用在哪里?有什么作用?6. 类的成员函数的调用顺序是什么?7. C++中的引用占用的内存大小是多少?8. 什么是悬空指针和内存泄漏?如何避免它们?9. free和delete的区别是什么?10. 多线程编程中可能会遇到哪些问题?如何进行线程同步?11. 什么是C++标准库(STL)?12. 迭代器和索引访问的区别是什么?13. 线程的生命周期有哪些状态,锁的种类有哪些?14. 解释一下std::map和std::unordered_map的区别。15. std::vector的resize()和reserve()有什么不同、以及使用场景?16. 如何实现线程安全,除了使用互斥锁还有哪些方法?17. std::vector扩容时,resize和push_back的区别是什么?18. std::vector扩容时为了避免频繁扩容采取了哪些策略?19. C++中空结构体的大小是多少?20. shared_ptr是如何管理资源的?21. 虚析构函数的底层实现原理是什么?22. 一个函数g(int x, int y),其中x和y的地址关系是什么?23. 移动赋值和拷贝赋值的区别是什么?24. lambda表达式中的捕获方式有哪些?引用捕获时需要注意什么?25. 处理哈希冲突的常见方法有哪些?26. std::unordered_map的扩容机制是怎样的?27. std::vector如何判断是否需要扩容?(size与capacity的关系)28. 构造函数可以被声明为override吗?为什么?29. 类中的静态成员函数可以是虚函数吗?30. 哪些成员函数不能被声明为虚函数?31. 如何确保一个类的实例只能在堆上创建?(私有构造函数、单例模式)32. 请解释你理解的虚继承。33. C++中哪些运算符无法被重载?34. 静态链接和动态链接的区别,动态链接的机制是什么?35. C++中如何调用C语言编写的函数?答案附在面经中  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
今天学习了函数的定义和使用。函数可以将一段具有特定功能的代码封装起来,使程序的结构更加清晰,也便于代码的复用。学习了函数的参数和返回值,参数可以用来传递数据给函数,返回值则可以将函数的计算结果返回给调用者。在定义函数时,要注意函数的参数类型和返回值类型的匹配。返回值类型 functionName(参数类型 参数名1, 参数类型 参数名2,...) {    // 函数体,包含具体的操作语句    return 返回值;}例如,定义一个简单的函数来输出欢迎信息:cpp#include using namespace std;void sayHello() {    cout }这里定义了一个无返回值(返回类型为void)的函数,其功能就是输出一段文本内容。这些只是初步定义函数的基础示例,不同语言在函数的细节特性(比如参数传递方式、函数重载、默认参数等方面)都还有很多可以深入学习和拓展的内容。尝试写了一些简单的函数,比如计算两个数的最大值、最小值,以及实现一个简单的数学运算函数库。在调用这些函数时,一开始对函数的参数传递方式有些混淆,导致函数的结果不正确,经过仔细检查和调试,终于找到了问题所在。通过今天的学习,认识到函数是 C++ 编程中非常重要的一部分,合理地使用函数可以大大提高编程的效率和代码的质量。
点赞 评论 收藏
分享
评论
4
15
分享
牛客网
牛客企业服务