《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

在这里插入图片描述

你好,我是拉依达。
感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。

《拉依达的嵌入式\驱动面试宝典》 最开始我个人的面试学习笔记,里面整合了所有我认为可能遇到的技术面试问题。随着我个人的学习以及参与面试,对内容不断完善。现在我已经步入工作阶段,空闲时间将之前的学习内容进行重新编排整理,并且加入了工作后更新系统的理解。是所有博客中投入最大的一个系列。包含我个人学习中所有的精华内容,希望可以最大限度的帮助到你。

所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到独一无二。

其中包含嵌入式软件开发、嵌入式驱动开发、linux驱动开发等职位遇到的所有技术方向问题。尤其是对驱动等底层问题的解析,适合准备相关工作或者学习提升的同学

————————————————————————————————————

第1章 C/CPP基础

1.1 编译

头文件的两种包含方式的区别

  • #include <> 的查找位置是系统目录,是标准库头文件所在目录;
  • #include “” 的查找位置是当前源文件所在目录 , 找不到再去系统目录;

动态库(.so/.dll)与静态库(.a/.lib)的区别

文件后缀不同

  • 静态库,linux系统下:xxx.a;window系统下:xxx.lib
  • 动态库,linux系统下:xxx.so;window系统下:xxx.dll

链接时期不同

  • 静态库是在链接阶段与其它.o文件链接成可执行程序,所以可执行程序体积相对较大
  • 动态库是在可执行文件运行时再加载到内存中

占用磁盘大小不同

  • 有n个可执行文件引用了同一个静态库,那么该静态库在磁盘中就有n个拷贝
  • 有n个可执行文件引用了同一个动态库,那么该动态库在磁盘中只有1个拷贝

库的发布方式不同

  • 修改静态库,除了重新编译静态库之外,还需要重新编译程序,再将程序发布出去
  • 修改动态库,只需要重新编译动态库,只发布动态库即可

程序启动速度不同

  • 使用静态库的程序启动速度较快,因为不需要花时间加载库
  • 使用动态库的程序启动速度较慢,因为需要花时间将动态库加载到内存

简述gcc编译过程

预编译、编译、汇编和链接

  1. 预编译阶段:hello.c–>hello.i , 加入头文件,替换宏,用于处理#开头的指令
  2. 编译阶段:hello.i–>hello.s , c/cpp程序转换成汇编程序
  3. 汇编阶段:hello.s–>hello.o , 将汇编程序转换成可链接的二进制程序
  4. 链接阶段:hello.o–>hello , 可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。

静态链接和动态链接

  • 静态链接:链接过程把需要内容已经链接到了生成的可执行文件中,删除静态库程序运行不影响
  • 动态链接:链接过程没有把内容链接进去,而是在执行的过程中,再去找要链接的内容,删除动态库程序不能运行

静态链接优缺点:(动态链接相反)

  • 优点:运行不需要库
  • 缺点:编译出程序大,更新模块要全部重新编译

动态库内的内存分配

  • 动态库和主调程序分别编译的,使用2个不同的堆。
  • 堆各自管理各自的,谁负责分配,谁就负责释放(一个模块分配的内存要在同一个模块中释放!)
  • 将动态库中申请到的堆内存的指针交给主调程序去释放时,主调程序的堆管理部分就会发现这个指针不合法,就失败了。

C提高编程技巧

  1. 空间换时间

    • 使用宏函数而不是函数,宏函数占用了大量的空间,而函数占用了时间。函数调用时保存和恢复当前的现场,进行压栈和弹栈操作。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间
  2. 使用位操作:减少除法和取模的运算

  3. 使用嵌入式汇编:提高效率,限制可移植性

C模块划分

  1. 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;
  2. 某模块提供给其它模块调用的外部函数及数据需在.h 中文件中冠以 extern 关键字声明;
  3. 模块内的函数和全局变量需在.c 文件开头冠以 static 关键字声明;
  4. 永远不要在.h 文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概
    念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。

统计数值中1的个数

int nums( int date)
{int num = 0;for(int i=0 ; i<32 ; i++){num += (date>>i)&0x01;}return num;
}
//更快速的方法是直接建立一个表,然后查表

对某一位置1或置0

//对一个char的第三位置0或置1
unsigned char c = 0x07;
c |= (0x01<<2); //置1
c &= ~(0x01<<2); //置0

对指定地址存储数据

int *p = (int *)0x12345678;
*p = 10;

c语言运算符优先级

优先级运算符类型运算符结合性
1后缀() [] -> . ++ –左到右
2一元++ – + - ! ~ (type)* & sizeof右到左
3乘法* / %左到右
4加法+ -左到右
5移位<< >>左到右
6关系< <= > >=左到右
7相等== !=左到右
8位与&左到右
9位异或^左到右
10位或|左到右
11逻辑与&&左到右
12逻辑或||左到右
13条件? :右到左
14赋值= += -= *= /= %= <<= >>= &= ^= |=右到左
15逗号,左到右

C语言面向对象实现多态

#include "stdio.h"typedef struct Person{char *name;void (*eat)();
}Person;void fun1(){printf("student eat!\r\n");
}
void fun2(){printf("teacher eat!\r\n");
}int main()
{Person student={"student",fun1};Person teacher={"teacher",fun2};student.eat();teacher.eat();
}

C++代码优化?

  1. 循环外移。
  2. 减少函数调用。(inline)
  3. 右值引用。

1.2 内存

堆和栈的区别?

  • 分配和回收机制不同——堆由程序员手动开辟与回收,栈由系统自动分配和回收
  • 存放内容不同——堆存你想存的数据,栈存放函数的相关参数,返回值,局变量,寄存器内容等
  • 地址增长方式不同——堆向地址增大方向增长,栈反过来
  • 大小不同——堆可开辟,理论课开辟整个虚拟内存,栈有上限
  • 效率——堆开辟慢,栈系统开辟快

哈希冲突?

​ 主要是通过哈希函数产生的哈希值是有限的,当数据比较多的时候,不同的元素经过相同的哈希函数产生了相同的值,这就是哈希冲突。

解决办法:

  1. 线性探测法
  2. 链式地址法
  3. 再散列法(哈希冲突的时候,再用不同哈希函数产生不同的值)
  4. 公共溢出区:一旦哈希函数计算的结构相同就放入公共溢出区

1.3 基础

main函数的返回值

  • main函数的返回值是返回给主调进程,让主调进程得知被调用程序的运行结果。
  • 标准规范中main函数返回int类型,返回0无错误。
  • 检查不严格编译器返回类型也可以是void(如vs),检查严格必须是int(如g++)

main函数执行前后

  1. 执行前

    • 设置栈指针
    • 初始化 .date段内容(静态static变量和 赋值全局变量)
    • 初始化 .bss段内容(未初始化全局变量 赋0)
    • 全局对象初始化,调用全局对象的构造函数
    • 将参数argc、argv 传递给main函数,运行main函数。argc 类型为int型 ,argv类型为字符串数组
  2. 执行后

    • atexit() 函数,在main函数结束后调用
    • atexit() 函数注册的顺序和调用的顺序相反

“\n” 和 endl 的区别

  • “\n” 输出换行
  • endl 输出换行还会刷新缓冲区 , endl = “\n” + flush()
  • 没有必要刷新输出流的时候应尽量使用 “\n”

命名空间std

名称空间:将库函数封装起来的方法。可以避免和应用程序发生命名冲突的问题。

  • 使用 cin,cout 这两个 iostream 对象,要包含 头文件,还得让命名空间 std 内的名称曝光,即 using namespace std;
  • 开发过程中,避免使用直接引入整个命名空间,否则会因为命名空间污染导致很多不必要的问题(自己写的函数名称相同)。建议使用由命名空间组合起来的全称:std::cout

初始化和赋值

  • 初始化:创建变量时赋予其一个初始值
  • 赋值:把对象的当前值擦除,再用一个新值来替代。

局部变量和全局变量

  • 局部变量:也称为内部变量,它是在函数内定义的,作用域仅限于函数内
  • 全局变量:也称为外部变量,它是在函数外部定义的变量。其作用域是整个程序。在函数内部,局部变量可以屏蔽全局变量。
  • 如果一个全局变量用 static 修饰,它就是静态全局变量,它的作用域是该文件范围(称为文件作用域,即其它文件不能使用它)

操作系统和编译器是怎么知道变量是全局还是局部?

  • 操作系统和编译器,可能是通过内存分配的位置来知道的
  • 全局变量分配在全局数据段
  • 局部变量则分配在栈里面

变量的静态存储和动态存储

变量的生存周期只与变量的存储位置(存储类别)有关

  • 静态存储(在程序运行期间,系统对变量分配固定的存储空间)
  • 动态存储(在程序运行期间,系统对变量动态(不固定)的分配存储空间)
  • auto 自动变量(动态存储方式)
    static 静态变量(静态存储方式)
    register 寄存器变量(动态存储方式)
    extern 外部变量(静态存储方式)

函数返回引用

  • 可以节省构造函数创建临时副本
  • 可以节省析构函数删除临时副本的时间
  • 但是不能返回临时对象的引用

this指针

  • 一个类的成员函数只有一份,为了分开不同对象的数据,执行类成员函数时,会把当前的this指针(对象的首地址)传入成员函数。函数体内的数据成员都会转化为this->数据成员的方式。
  • 非静态成员函数(包括构造函数和析构函数)有自己的this指针,指向当前调用的对象。
  • 静态成员函数和友元函数没有this指针

为什么静态成员函数不用this指针?

  • 静态成员函数属于整个类,所有对象共有,独立于对象之外的。
  • this指针是类的实例指针,操作对象实例内容的,所以静态不用this指针
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491670.html

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

相关文章

【Linux】—简单实现一个shell(myshell)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff01; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&…

数据结构day5:单向循环链表 代码作业

一、loopLink.h #ifndef __LOOPLINK_H__ #define __LOOPLINK_H__#include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {union{int len;DataType data;};struct node* next; }loopLink, *loopLinkPtr;//创建 loopLinkPtr create();//…

利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别,并给出模型介绍与代码实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下利用CNN与多尺度特征、注意力机制的融合实现低分辨率人脸表情识别&#xff0c;并给出模型介绍与代码实现。在当今社会&#xff0c;人脸识别技术已广泛应用&#xff0c;但特定场景下的低质量图像仍是一大挑战。 低分…

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中&#xff0c; 是一个方法调用&#xff0c;实际上等价于调用 equals 方法。不仅适用于字符串&#xff0c;还可以用于任何类型&#xff0c;并且自动处理 null。 Demo&#xff1a; Java 的 在 J…

驱动开发-入门【1】

1.内核下载地址 Linux内核源码的官方网站为https://www.kernel.org/&#xff0c;可以在该网站下载最新的Linux内核源码。进入该网站之后如下图所示&#xff1a; 从上图可以看到多个版本的内核分支&#xff0c;分别为主线版本&#xff08;mainline&#xff09;、稳定版本&#…

Android Room 数据库使用详解

一、Room介绍 Android Room 是 Google 提供的一个 Android 数据持久化库&#xff0c;是 Android Jetpack 组成部分之一。它提供了一个抽象层&#xff0c;使得 SQLite 数据库的使用更为便捷。通过 Room&#xff0c;开发者可以轻松地操作数据库&#xff0c;不需要直接编写繁琐的…

使用k6进行Redis基准测试

1.安装环境 前提条件&#xff1a;已经安装go 安装xk6 go install go.k6.io/xk6/cmd/xk6latest 安装成功会在GOPATH目录生成xk6可执行文件 安装xk6-redis 切换到xk6工作目录&#xff0c;执行如下命令 cd /Users/wan/go/bin ./xk6 build --with github.com/grafana/xk6-re…

【期末复习】JavaEE(上)

1. Java EE概述 开发环境及开发工具 1.1. HTTP协议 开发模式 2. Java Web技术 JSP技术 2.1. Servlet技术 2.1.1. HttpServletRequest 常用方法 2.1.2. HttpServletRequest 请求乱码 tomcat7 及以下&#xff08;对于每个参数单独进行编码转换&#xff09;&#xff1a; 2.…

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403&#xff0c;发表在Mlsys Introduction 优化KV cache的策略&#xff0c;主要是集中在系统级别的优化上&#xff0c;比如FlashAttention、PagedAttention&#xff0c;它…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环

效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…

【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园

目录 [[数字花园]]的构建原理包括三个步骤&#xff1a;五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园&#xff08;在线个人知识库&#xff09;的经历&#xff0c;首先尝试的是网上普遍使用的方法&#xff0c;也就是本篇文章介绍的。 后面会继续…

el-table表格嵌套子表格:展开所有内容;对当前展开行内容修改,当前行默认展开;

原文1 原文2 原文3 一、如果全部展开 default-expand-all"true" 二、设置有数据的行打开下拉 1、父table需要绑定两个属性expand-row-key和row-key <el-table:data"tableData":expand-row-keys"expends" //expends是数组&#xff0c;设置…

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRDNN深度神经网络分位数回归时间序列区间预测。QRDNN模型…

用.Net Core框架创建一个Web API接口服务器

我们选择一个Web Api类型的项目创建一个解决方案为解决方案取一个名称我们这里选择的是。Net 8.0框架 注意&#xff0c;需要勾选的项。 我们找到appsetting.json配置文件 appsettings.json配置文件内容如下 {"Logging": {"LogLevel": {"Default&quo…

扩展SpringBoot中的SpringMVC的默认配置

SpringBoot默认已经给我们做了很多SpringMVC的配置&#xff0c;哪些配置&#xff1f; 视图解析器ViewResolver静态资料的目录默认首页index.html图标名字和图标所在目录&#xff0c;favicon.ico类型转换器Converter&#xff0c;格式转换器的Formatter消息转换器HttpMessageCon…

练习题:一维数组

练习题 第一题 键盘录入一组数列&#xff0c;利用冒泡排序将数据由大到小排序 代码 #include <stdio.h>int arr_home01() {int arr[10];int i,j,temp;printf("请输入10个测试整数&#xff1a;\n");int len sizeof(arr) / sizeof(arr[0]);for(i 0;i < …

2024安装hexo和next并部署到github和服务器最新教程

碎碎念 本来打算写点算法题上文所说的题目&#xff0c;结果被其他事情吸引了注意力。其实我之前也有过其他博客网站&#xff0c;但因为长期不维护&#xff0c;导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上&#xff0c;github不倒&#xff0c;网站不灭&…

【鸿睿创智开发板试用】RK3568 NPU的人工智能推理测试

目录 引言 驱动移植 例程编译 修改build.sh 执行编译 运行测试 部署libc的库文件 执行测试程序 结语 引言 鸿睿创智的H01开发板是基于RK3568芯片的&#xff0c;瑞芯微芯片的一大特色就是提供了NPU推理的支持。本文将对其NPU推理进行测试。 驱动移植 H01的开发板已经…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率&#xff0c;二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…