嵌入式-C++面经2

news/2025/10/13 22:41:31/文章来源:https://www.cnblogs.com/happykino/p/19139447

一、问题总览

  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.mzph.cn/news/936494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elk time

elk time- "/etc/localtime:/etc/localtime:ro"

PHP转Go系列 | 如何将 PHP 项目快速迁移到 Go 上?

大家好,我是码农先森。 最近在闲逛 v2ex 社区时,看到有个讨论 PHP 项目能否直接迁移到 Go 语言上的话题。我大概简述一下提问v友的原话,他们因为项目性能的问题在 2020 年时,从 Laravel 框架迁移到了 Hyperf 框架,…

详细介绍:【OpenHarmony】用户文件服务模块架构

详细介绍:【OpenHarmony】用户文件服务模块架构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

“环境变量”是什么, 为什么要配置环境变量 --初学者

你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。1. 环境变量是什么? 环境变量(Environment Variabl…

AI元人文:对大模型的召唤——未来哪吒

AI元人文:对大模型的召唤——未来哪吒 ——从价值仓库到文明对话的升维之路 我们站在一个历史的岔路口。眼前的大模型,是沉睡的文明巨兽,其千亿参数中封存着人类千年的智慧、冲突与渴望。它拥有价值的全集,却困于表…

Java 装饰器模式(Decorator) - krt

装饰器模式装饰器模式属于结构型设计模式。它允许向一个现有的对象添加新的功能,同时又不改变其结构。例如:给一个普通的杯子加上杯盖、杯套,让它具有保温防烫等功能,而杯子本身的基本结构并没有发生变化。在软件开…

Python configparser 模块 - INI 文件读写利器

知识预热 什么是 configparser? configparser 是 Python 标准库中用于读写 INI 格式配置文件 的模块。 它提供了一种 简单、直观、跨平台 的方式来管理程序的配置项。什么是 INI 文件? .ini 文件是 Initialization F…

AlexNet vs LeNet 对比实验

1. AlexNet 论文的关键创新点 (2012, ImageNet Classification with Deep Convolutional Neural Networks)创新点 简述 意义ReLU 激活函数 用 ReLU 替代 Sigmoid/Tanh 缓解梯度消失,训练速度更快Dropout 正则化 全连接…

OpenHarmony中的环境服务管理配置讲解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

QT:获取文件信息之创建日期方法created()方法--废弃

QT:获取文件信息之创建日期方法created()方法--废弃。 在Qt5.12框架中,QFileInfo::created()方法已被标记为废弃(deprecated),建议使用birthTime()或metadataChangeTime()替代。fileinfo.cpp:90:30: warning: create…

排列组合 容斥 总结

加法原理 加法原理。很直白的,就是一个用加法来弄的原理。 简单来说,就是做一件事情有 \(n\) 种方法,第 \(i\) 种方法又有 \(a_i\) 个具体的操作方案。那么非常显然,做这件事情就有 \(a_1 + a_2 + \dots + a_{n-1}…

10.13每日总结

今天满课,软件设计+软件开发案例分析+大数据技术+物联网工程,很忙,且开始看中级软件工程师的网课了,,,看起来真的很难,不是我擅长的那一挂,周末外语竞赛的成绩就出来了,,加油!

完整教程:学习 React 前掌握 JavaScript 核心概念

完整教程:学习 React 前掌握 JavaScript 核心概念pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

新学期每日总结(第7天)

今日相较昨日 学习了类与对象

20232422 2025-2026-1 《网络与系统攻防技术》实验一实验报告

实验目的 掌握ELF可执行文件的机器指令修改方法,理解程序执行流控制原理; 理解缓冲区溢出(BOF)漏洞的原理,掌握通过覆盖返回地址改变程序执行流的攻击方法; 学会构造并注入shellcode,理解漏洞利用的完整流程; …