当前位置: 首页 > news >正文

嵌入式-C++面经2

一、问题总览

  1. cpp重载和重写的区别
  2. cpp虚函数表
  3. 指针和引用的区别
  4. linux的常用开发指令
  5. linux编译运行程序的指令
  6. 关键字inline
  7. 什么场景使用内联
  8. 如何避免内存泄露
  9. map和unordered_map
  10. 引用外部头文件双引号和尖括号的区别
  11. private、public、protected的区别
  12. new和malloc的区别

二、技术面

2.1 cpp重载和重写的区别

答:
img

  • 重载:函数名必须相同,但参数列表必须不同(参数类型、个数、顺序不同),与返回值类型无关。

  • 重写:子类函数必须与父类的虚函数函数名、参数列表、返回值类型完全相同(协变返回类型除外),且父类函数必须声明为virtual。

2.2 cpp虚函数表

答:
虚函数表(Virtual Table,简称 Vtable)是 C++ 实现多态(Polymorphism)的底层机制,用于在运行时确定应该调用哪个虚函数版本。它是编译器在编译阶段为包含虚函数的类生成的一张函数指针表,存储该类所有虚函数的地址。

2.1.1 单一继承场景

假设有父类Animal和子类Dog,其中Animal包含虚函数makeSound(),Dog重写该函数:

class Animal 
{
public:virtual void makeSound() { cout << "动物叫" << endl; }virtual void eat() { cout << "动物吃" << endl; }
};class Dog : public Animal 
{
public:void makeSound() override { cout << "汪汪叫" << endl; }// 未重写eat(),继承父类版本
};

编译器会生成两个虚函数表:
Animal 的虚函数表:[&Animal::makeSound, &Animal::eat]
Dog 的虚函数表:[&Dog::makeSound, &Animal::eat](重写的makeSound替换父类版本,eat继承父类)


Animal对象:
+----------+
| Vptr | --> 指向Animal的虚函数表
+----------+

Dog对象:
+----------+
| Vptr | --> 指向Dog的虚函数表(继承自Animal的部分)
+----------+


2.3 指针和引用的区别

img

img

2.4.1 关键区别对比
  • 指针
    • 本身是一个变量,占用内存空间(32 位系统 4 字节,64 位系统 8 字节),存储的是目标变量的地址。
    • 可以被重新赋值,指向其他同类型变量。
int a = 10;
int* p;       // 未初始化(野指针,禁止直接使用)
p = &a;       // 后续可指向a
p = nullptr;  // 可指向空
  • 内存
    • 声明时必须初始化,且一旦绑定某个变量,终身不能再绑定其他变量(从一而终)。
    • 只是目标变量的别名,不占用额外内存空间(编译器处理为常量指针,但语法上隐藏了指针特性)。
    • 一旦绑定变量,不能改变绑定对象(但可以修改目标变量的值)。
int a = 10, b = 20;
int& r = a;   // 正确:初始化绑定a
// int& r;    // 错误:引用必须初始化
r = b;        // 不是重新绑定,而是将b的值赋给a(r仍绑定a)

2.4 linux的常用开发指令

xxx

2.5 linux编译运行程序的指令

xxx

2.6 关键字inline

inline 是 C++ 中的一个关键字,用于建议编译器将函数调用替换为函数体本身(即 “内联展开”),以减少函数调用的开销(如栈帧创建、参数传递等),从而提高程序运行效率。

  • 核心作用:减少函数调用开销
    • 函数调用时,系统需要执行以下操作(有性能成本):
    • 保存当前函数的栈帧状态(返回地址、局部变量等)。
    • 传递参数,跳转到被调用函数的入口。
    • 函数执行完毕后,恢复栈帧并返回。

内联函数通过 “原地展开” 避免这些操作,适合短小简单的函数

2.7 什么场景使用内联

短小、频繁调用、性能敏感的函数才考虑内联,避免盲目使用导致代码膨胀。

2.8 如何避免内存泄露

  1. 优先使用智能指针(C++11 及以上)
  2. 避免手动管理动态内存
  3. 严格遵循 “谁申请,谁释放” 原则
  4. 避免在异常场景下泄漏

2.9 map和unordered_map

img

2.10 引用外部头文件双引号和尖括号的区别

img

2.11 private、public、protected的区别

img

4.12 new和malloc的区别

img

http://www.gsyq.cn/news/20516.html

相关文章:

  • 图像分类
  • https与http区别思维拓扑图 - krt
  • OpenHarmony中的环境服务管理配置讲解
  • 10.13每日总结
  • 完整教程:学习 React 前掌握 JavaScript 核心概念
  • 新学期每日总结(第7天)
  • 实验记录 2025/10/13
  • 正睿25csp七连测day5
  • 14 10.13
  • 深入解析:flutter AudioPlayer的使用问题及处理
  • 11 10.10
  • 新手村程序
  • Android Camera openCamera - 教程
  • 信号与系统
  • 大作业第一阶段验收小组集体加5分 -
  • [Vulhub靶机]W1R3S靶机渗透
  • 实用指南:Apache Doris 4.0 AI 能力揭秘(二):为企业级应用而生的 AI 函数设计与实践
  • QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口 - 指南
  • 咬鼠
  • 10月13日日记
  • 【知识总结】数据库的事务、并发与锁管理
  • 描述https的加密过程
  • CSP-S 2025 提高级模拟赛 Day6 复盘 A.选择方案
  • MongoDB安装及使用
  • 从Gemini Robotics看通用机器人的科技路径
  • Windows7 隐藏用户
  • 10 月记录
  • 网络安全基础--第五课:跨站脚本攻击XSS - 实践
  • 2025.10.13总结 - A
  • 洛谷版自我介绍