嵌入式大厂面经第 8(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

1. struct 和 class 的区别

主要区别

  • 默认访问权限不同:struct:默认为 publicclass:默认为 private
  • 默认继承方式不同:struct:默认 public 继承class:默认 private 继承
  • 使用习惯不同:struct:通常用于简单的数据结构class:通常用于实现完整的面向对象功能
// struct 示例
struct Point {
    int x;  // 默认 public
    int y;  // 默认 public
    
    void setPoint(int a, int b) {  // 默认 public 方法
        x = a;
        y = b;
    }
};

// class 示例
class Circle {
    double radius;  // 默认 private
    
public:
    Circle(double r) : radius(r) {}
    
    double getArea() {
        return 3.14159 * radius * radius;
    }
};

// 继承示例
struct DerivedStruct : Point {  // 默认 public 继承
    int z;
};

class DerivedClass : Circle {  // 默认 private 继承
    // 无法访问 Circle 的 public 成员
};


2. C++ 类的访问权限

三种访问权限

  1. public类内外都可访问子类可继承
  2. protected类内可访问子类可继承类外不可访问
  3. private类内可访问子类不可继承类外不可访问
class Base {
public:
    int publicVar;      // 公有成员
    
    void publicMethod() {
        cout << "Public method" << endl;
        privateMethod();  // 类内可访问私有方法
    }
    
protected:
    int protectedVar;   // 保护成员
    
    void protectedMethod() {
        cout << "Protected method" << endl;
    }
    
private:
    int privateVar;     // 私有成员
    
    void privateMethod() {
        cout << "Private method" << endl;
    }
};

// 继承与访问权限
class Derived : public Base {
public:
    void test() {
        publicVar = 1;      // 可访问基类公有成员
        protectedVar = 2;   // 可访问基类保护成员
        // privateVar = 3;  // 错误:不能访问基类私有成员
        
        publicMethod();     // 可调用基类公有方法
        protectedMethod();  // 可调用基类保护方法
        // privateMethod(); // 错误:不能调用基类私有方法
    }
};

// 友元函数和友元类
class MyClass {
private:
    int data;
    
    friend void friendFunction(MyClass& obj);  // 友元函数声明
    friend class FriendClass;                  // 友元类声明
    
public:
    MyClass(int d) : data(d) {}
};

// 友元函数可以访问私有成员
void friendFunction(MyClass& obj) {
    cout << "Friend function accessing private data: " << obj.data << endl;
}

// 友元类可以访问私有成员
class FriendClass {
public:
    void accessPrivateData(MyClass& obj) {
        cout << "Friend class accessing private data: " << obj.data << endl;
    }
};


3. 内联函数

基本概念

  • 通过 inline 关键字声明
  • 编译时将函数调用替换为函数体
  • 减少函数调用开销,提高执行效率

特点与使用场景

  1. 优点减少函数调用开销提高执行效率保持代码可读性
  2. 缺点增加代码体积不适合复杂函数不适合频繁修改的函数
// 内联函数定义方式一:使用 inline 关键字
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

// 内联函数定义方式二:在类定义中直接实现
class Calculator {
public:
    // 自动成为内联函数
    int add(int a, int b) {
        return a + b;
    }
    
    // 显式声明为内联函数
    inline int subtract(int a, int b);
    
    // 声明为非内联函数
    int multiply(int a, int b);
};

// 类外定义内联函数
inline int Calculator::subtract(int a, int b) {
    return a - b;
}

// 类外定义非内联函数
int Calculator::multiply(int a, int b) {
    return a * b;
}

// 内联函数的实际应用
class Vector {
private:
    double x, y, z;
    
public:
    Vector(double a, double b, double c) : x(a), y(b), z(c) {}
    
    // 简单的访问器和修改器适合内联
    inline double getX() const { return x; }
    inline double getY() const { return y; }
    inline double getZ() const { return z; }
    
    inline void setX(double a) { x = a; }
    inline void setY(double b) { y = b; }
    inline void setZ(double c) { z = c; }
    
    // 复杂计算不适合内联
    double magnitude() const;
};

// 非内联实现
double Vector::magnitude() const {
    return sqrt(x*x + y*y + z*z);
}


内联函数注意事项

  1. 内联是建议性的编译器可能忽略 inline 关键字复杂函数可能不会被内联
  2. 不适合内联的情况包含循环或递归的函数函数体过大的函数包含虚函数调用的函数
  3. 调试困难内联函数在调试时可能无法单步执行可能导致错误定位困难

更多内容全在下方专栏

全网最受欢迎的嵌入式笔试专栏

笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学

3000+订阅还会涨价,提前订阅提前享受,持续更新中。

专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

#嵌入式笔面经分享##嵌入式测试,嵌入式开发#
全部评论

相关推荐

bg:&nbsp;双9,2024级硕,传统工科专业,算法知识范围仅限知道一些机器学习理论,了解基本的pytorch语法,打算砖码算法岗位,计划研1下找一段实习,从今年3月初已经开始在各大平台搜索实习经验了。转码时间线:2.28开始有实习想法,但是在岗位上纠结,在后端,大模型岗位纠结。最终决定大模型岗3.1-3.7吴恩达机器学习3.8-3.21李沐深度学习3.22开始刷leedcode3.24开始做简历3.24-3.25在github上跑开源项目:BERT部署+文本分类3.25-4.1在github上跑开源项目:ChatGLM-6B部署+LLaMA-Factory微调+Prompt模板3.27注册BOSS直聘3.28参加了第一场初创公司大模型的面试,感觉面试还可以,基本上能hold住但最后也都无疾而终了,盲猜可能是技术栈不太相符以及觉着我是低年级。3.29-4.5在github上跑开源项目:Llama3-8B+RAG4.7收到三家公司面试4.7下午面试一家中厂,问题太工程,而我是凑开源项目+偏算法理论性的科研,完全经不住拷打。4.8收到第一个offer,岗位感觉偏大模型调研,拒绝。4.10收到第二个offer,离学校路程半小时+大模型核心岗,但小厂,接收。回归整个实习准备,对我个人而言其实最难的是不断细化调整方向,以及在面试pass被无数次的心态调整,但总体来说是看着自己一步步的进步。记得第一次修改简历时,我对着空白文档发呆了两个小时,如今却能快速抓住岗位JD的关键词进行精准匹配;曾经在群面中紧张到声音发抖,现在面对压力面试已经能从容展现逻辑思维。
实习,不懂就问
点赞 评论 收藏
分享
1.&nbsp;项目背景:针对端侧设备(树莓派、昇腾、RK系列)的低资源环境,设计一套轻量化分布式框架,实现大模型(LLM/ASR/TTS等)的高效协同推理,解决端侧设备算力分散、通信受限、动态扩展难等问题。技术栈:Linux、C++、ZMQ、设计模式、分布式架构、主从Reactor模式、docker、cmake、shell3.&nbsp;项目设计方案1.&nbsp;双模式部署设计:设计Docker与裸机双部署方案,通过自动化镜像部署和容器操作脚本,环境部署效率提升70%2.&nbsp;底层混合通信组件:-&nbsp;设计基于ZMQ的多模式通信中间件,通过工厂模式统一创建PUB/SUB、PUSH/PULL、RPC等6种通信策略,结合策略模式实现动态通信方式切换,降低业务层网络代码复杂度70%;-&nbsp;构建高可用RPC框架,支持方法动态注册与服务发现,通过设置双端超时控制与自动重连机制提高通信可靠性;-&nbsp;设计ZMQ消息封装模块,开发轻量级序列化协议,采用长度前缀+紧凑存储结构设计实现多参数打包/解包3.&nbsp;channel模块设计:-&nbsp;统一管理底层多模式通信中间件的ZMQ连接,支持动态URL绑定,信道注册-&nbsp;设计观察者模式和闭包方案,实现网络层与业务逻辑的解耦-&nbsp;通过动态work_id路由和连接池技术,实现多unit单元通信隔离-&nbsp;JSON协议设计,用于节点间/外部用户消息交互4.&nbsp;分布式任务调度框架设计-与业务节点关系(继承)-&nbsp;采用&nbsp;Reactor模式,设计异步事件驱动的任务调度框架,通过eventpp实现毫秒级事件响应-&nbsp;动态RPC服务注册,支持跨业务节点&nbsp;setup/exit&nbsp;等指令的远程调用-&nbsp;统一管理&nbsp;work_id-channel&nbsp;连接池,对上层业务节点屏蔽底层通信复杂性-&nbsp;提供标准化setup等虚函数接口,支持业务节点自定义任务处理逻辑5.&nbsp;unit-manager模块-&nbsp;设计RPC服务注册,实现信道自动注册/释放,SQL处理;并解析&nbsp;action&nbsp;实现动态分发请求-&nbsp;实现轻量化内存kv缓存数据库&nbsp;存储&nbsp;unit&nbsp;元信息;并提供线程安全SQL查询接口,供节点动态通信-&nbsp;设计多协议网关,实现TCP/ZMQ协议转换,支持外部用户-内部业务节点通信交互-&nbsp;设计主从多Reactor&nbsp;TCP通信框架,实现压测10000+TCP并发连接6.&nbsp;Node业务层接口设计-&nbsp;TASK任务管理:实现单任务实例管理,模型加载/推理/流式输出回调机制等-&nbsp;服务层控制:自定义实现setup等接口,对业务节点进行生命周期管理,实现节点间相互订阅
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务