嵌入式秋招面经总结
CPU、寄存器、缓存、内存概述
- CPU:中央处理器,执行指令的核心组件。
- 寄存器:CPU内部的临时存储空间,存放快速访问的数据。
- 缓存(Cache):在寄存器和内存之间的高速存储,分为三级(L1、L2、L3),速度和价格依次降低。
- 内存:主要存储程序和数据的地方。
数据访问流程
1. CPU首先在寄存器中查找数据。
2. 如果寄存器未命中,则检查缓存。
3. 如果缓存未命中,则从内存中获取数据。
内存区域
- 栈区:
- 存放函数参数和局部变量。
- 由编译器自动分配和释放,效率高,但内存量有限(如iOS中为2M)。
- 堆区:
- 通过`new`、`malloc`等动态分配的内存。
- 需要程序员手动释放,可能导致内存泄漏。
- 静态区:
- 存放全局变量和静态变量。
- 程序结束时由系统释放。
- 常量区:
- 存放常量,不允许修改。
- 代码区:
- 存放函数体的二进制代码。
类型说明符
- 基本类型:`void`、`char`、`short`、`int`、`long`、`signed`、`unsigned`、`float`、`double`、`struct`、`enum`、`union`。
- 存储类型:`extern`、`static`、`register`、`auto`、`typedef`。
- 类型限制符:`const`(只读)、`volatile`。
变量理解
- extern:指示变量在其他文件中定义。
- static:
- 限制变量作用域。
- 局部变量存入静态存储区,延长生存周期。
- register:将频繁使用的变量放入寄存器以提高效率。
- auto:C语言默认存储类型。
- typedef:给类型或变量表达式起别名。
- const:只读变量。
- volatile:
- 防止编译器优化。
- 适用于中断和多线程环境。
C程序内存分配
- 堆、栈、静态存储区、文件分配区(常量字符串)、程序分配区(二进制代码)。
sizeof与strlen
- sizeof:关键字,返回类型或数组的字节大小。
- strlen:计算字符串长度,直到遇到`\0`。
函数参数传递
- 值传递、引用传递、指针传递、数组地址传递。
Const、指针、基本类型组合的意义
- const int x:只读变量。
- const char *x:指向常量的指针,指针内容可变,指向内容不可变。
- char *const x:常量指针,指针内容不可变,指向内容可变。
- const char *const x:指针和内容均不可变。
数组与指针
- 物理地址:内存单元的真实地址。
- 逻辑地址:CPU生成的地址。
Linux进程间通信
- 管道(pipe)、信号量、消息队列、信号、共享内存、套接字。
strcpy与memcpy区别
- strcpy:复制字符串。
- memcpy:复制指定长度的内存内容。
内存泄漏与内存溢出
- 内存泄漏:未释放的内存,导致可用内存减少。
- 内存溢出:程序请求的内存大于可用内存。
switch的变量类型限制
- 允许:整形、布尔、字符、枚举。
- 不允许:字符串等非基本类型。
防止头文件重复调用
- 使用#ifndef和#pragma once。
实时操作系统
- 示例:FreeRTOS、Ucos。
指针数组与数组指针
- 指针数组:数组元素为指针。
- 数组指针:指向数组的指针。
结构体自增与双重指针自增
- 自增从右向左进行。
寄存器的使用
- 存储频繁调用的数据,减少内存访问。
获取全局变量与局部变量地址(gdb)
- 使用backtrace或bt命令。
进程中的同步与异步
- 同步:通过锁实现。
- 自旋锁:忙等待,不阻塞线程。
- 互斥锁:阻塞线程,等待资源释放。
进程与线程的关系与区别
- 进程:资源分配的基本单位,包含一个或多个线程。
- 线程:进程中的执行单位,最小调度单位。
树的遍历(递归与非递归)
- 中序遍历:左子树 - 根节点 - 右子树,利用堆栈进行进栈和出栈操作。
剩余的大佬面经总结了 链接在下边
- CPU:中央处理器,执行指令的核心组件。
- 寄存器:CPU内部的临时存储空间,存放快速访问的数据。
- 缓存(Cache):在寄存器和内存之间的高速存储,分为三级(L1、L2、L3),速度和价格依次降低。
- 内存:主要存储程序和数据的地方。
数据访问流程
1. CPU首先在寄存器中查找数据。
2. 如果寄存器未命中,则检查缓存。
3. 如果缓存未命中,则从内存中获取数据。
内存区域
- 栈区:
- 存放函数参数和局部变量。
- 由编译器自动分配和释放,效率高,但内存量有限(如iOS中为2M)。
- 堆区:
- 通过`new`、`malloc`等动态分配的内存。
- 需要程序员手动释放,可能导致内存泄漏。
- 静态区:
- 存放全局变量和静态变量。
- 程序结束时由系统释放。
- 常量区:
- 存放常量,不允许修改。
- 代码区:
- 存放函数体的二进制代码。
类型说明符
- 基本类型:`void`、`char`、`short`、`int`、`long`、`signed`、`unsigned`、`float`、`double`、`struct`、`enum`、`union`。
- 存储类型:`extern`、`static`、`register`、`auto`、`typedef`。
- 类型限制符:`const`(只读)、`volatile`。
变量理解
- extern:指示变量在其他文件中定义。
- static:
- 限制变量作用域。
- 局部变量存入静态存储区,延长生存周期。
- register:将频繁使用的变量放入寄存器以提高效率。
- auto:C语言默认存储类型。
- typedef:给类型或变量表达式起别名。
- const:只读变量。
- volatile:
- 防止编译器优化。
- 适用于中断和多线程环境。
C程序内存分配
- 堆、栈、静态存储区、文件分配区(常量字符串)、程序分配区(二进制代码)。
sizeof与strlen
- sizeof:关键字,返回类型或数组的字节大小。
- strlen:计算字符串长度,直到遇到`\0`。
函数参数传递
- 值传递、引用传递、指针传递、数组地址传递。
Const、指针、基本类型组合的意义
- const int x:只读变量。
- const char *x:指向常量的指针,指针内容可变,指向内容不可变。
- char *const x:常量指针,指针内容不可变,指向内容可变。
- const char *const x:指针和内容均不可变。
数组与指针
- 物理地址:内存单元的真实地址。
- 逻辑地址:CPU生成的地址。
Linux进程间通信
- 管道(pipe)、信号量、消息队列、信号、共享内存、套接字。
strcpy与memcpy区别
- strcpy:复制字符串。
- memcpy:复制指定长度的内存内容。
内存泄漏与内存溢出
- 内存泄漏:未释放的内存,导致可用内存减少。
- 内存溢出:程序请求的内存大于可用内存。
switch的变量类型限制
- 允许:整形、布尔、字符、枚举。
- 不允许:字符串等非基本类型。
防止头文件重复调用
- 使用#ifndef和#pragma once。
实时操作系统
- 示例:FreeRTOS、Ucos。
指针数组与数组指针
- 指针数组:数组元素为指针。
- 数组指针:指向数组的指针。
结构体自增与双重指针自增
- 自增从右向左进行。
寄存器的使用
- 存储频繁调用的数据,减少内存访问。
获取全局变量与局部变量地址(gdb)
- 使用backtrace或bt命令。
进程中的同步与异步
- 同步:通过锁实现。
- 自旋锁:忙等待,不阻塞线程。
- 互斥锁:阻塞线程,等待资源释放。
进程与线程的关系与区别
- 进程:资源分配的基本单位,包含一个或多个线程。
- 线程:进程中的执行单位,最小调度单位。
树的遍历(递归与非递归)
- 中序遍历:左子树 - 根节点 - 右子树,利用堆栈进行进栈和出栈操作。
剩余的大佬面经总结了 链接在下边
c++/嵌入式面经专栏-牛客网
https://gw-c.nowcoder.com/api/sparta/jump/link?link=https%3A%2F%2Fwww.nowcoder.com%2Fcreation%2Fmanager%2FcolumnDetail%2FMJNwoM
全部评论
相关推荐
今天 11:45
北京理工大学 C++ 点赞 评论 收藏
分享