📜  Adobe 面试体验 |计算机科学家(5 年经验)

📅  最后修改于: 2021-09-23 06:11:47             🧑  作者: Mango

第 1 轮:F2F 技术(1 小时)

关于以前的 C++ 项目的讨论。

设计字典。您将支持的 API 和用于存储所有数据的数据结构。 : 我提出了一个Trie数据结构。我被要求在记事本上实现数据结构和数据字段。他正在寻找生产质量的代码。需要考虑的事项:单词的多重定义、使用枚举的错误代码设计、类结构等。

然后我被要求在记事本上为特里结构实现添加和删除 api,处理所有极端情况。

第 2 轮:F2F 技术(1 小时)

这一轮我发现在更艰难的一面。下面是他问我的事情。

C++ 11 特性:Lambda 函数、唯一指针和另外 1-2 个我不太记得的特性。

然后是继承:虚函数,如何通过指向基类的指针访问派生类函数。

编译时派生类的内存映射:我给出了 vPointer 和 vTable 的解释。他详细讨论了所有东西都存储在 vTable 中的内容。访问基类函数。

他询问了 C++ 中的不完整类型。何时使用它们以及如何正确使用它们。讨论了在类型不完整的情况下的编译器操作。

他问 C++ 中的前向声明,它们有什么用。详细讨论了 Pimpl 模式和不完整类型。给了我 Pimpl Pattern 的代码来检查和修复错误。

然后是智能指针,他问了共享指针,它们是如何实现的。编译时共享指针对象的内存映射。

共享指针之间如何共享引用计数?调用共享指针的复制构造函数时会发生什么。

然后是互斥量、信号量和条件变量。等待并通知目的。何时使用条件变量。

在 wait() 的情况下虚假唤醒:这是我不知道的。他解释了这个术语及其后果,以及为什么条件等待是在 while 循环中而不是 if 检查。

他询问了 std::promise() 和 std::future()。为promise 的set() 和future 的get() 编写代码,并使用锁和条件变量在它们之间进行同步。

在上面的讨论中,他还询问了 RAII 概念以及在互斥锁锁定时发生崩溃时的堆栈展开。

第 3 轮:F2F 技术

他询问了当前的项目。让我解释一下我用 C++ 完成的当前项目的架构。

然后他让我设计一个可以处理来自应用程序的并发调用的 SDK:我提出了多线程设计来处理对 sdk 的并发调用。他让我画类结构 LLD 。我解释了 ThreadPool 工厂类的设计,以及如何管理线程创建和销毁以及其他类。却达不到他的期待。不知道他在找什么。我发现这个人在沟通方面非常薄弱,考虑到他在 Adobe 担任较高职位之一。