秋招面试题记录
嵌入式软件开发 网上搜集的题目
1.Static关键词的作用?
static
关键字有三个主要作用:
- 局部变量:在函数内部,
static
局部变量只初始化一次,且在函数调用结束后仍然保留其值。 - 全局变量/函数:在文件内部,
static
限制全局变量或函数的作用域,使其仅对当前文件可见。 - 类成员:在类中,
static
成员变量或函数属于类本身而非某个对象,可以不通过对象访问。
好的,我将通过三个简短的代码示例来解释 static
关键字的三个主要作用:
1. 局部变量的 static
作用
在函数内部,static
局部变量的值在多次调用中保持不变,并且只初始化一次。
#include <iostream>
void counter() {static int count = 0; // 只初始化一次count++;std::cout << "Count: " << count << std::endl;
}int main() {counter(); // 输出 Count: 1counter(); // 输出 Count: 2counter(); // 输出 Count: 3
}
解释:count
是静态局部变量,函数多次调用时,它的值得以保留并累加。
2. 全局变量/函数的 static
作用
使用 static
限制全局变量或函数的作用域,使其只能在定义它的源文件中可见。
// file1.cpp
static int hiddenVar = 10; // 只能在 file1.cpp 中访问static void hiddenFunc() {std::cout << "This is a static function in file1.cpp" << std::endl;
}// file2.cpp
// hiddenVar 和 hiddenFunc 在此不可访问
解释:hiddenVar
和 hiddenFunc
只能在 file1.cpp
中使用,file2.cpp
无法访问它们。
3. 类成员的 static
作用
static
类成员属于类本身,而不是某个对象,且所有对象共享这一成员。
#include <iostream>
class MyClass {
public:static int sharedValue; // 静态成员变量static void display() { // 静态成员函数std::cout << "Shared value: " << sharedValue << std::endl;}
};int MyClass::sharedValue = 42;int main() {MyClass::display(); // 通过类名访问静态成员函数MyClass obj1, obj2;obj1.sharedValue = 100;MyClass::display(); // 输出 Shared value: 100(所有对象共享该值)
}
解释:sharedValue
是类的静态成员,所有 MyClass
对象共享这一个变量。
4.指针常量和常量指针
-
常量指针(Pointer to Constant):指向的值是常量,不能修改这个值,但指针可以指向其他地址。
- 作用:用来保护指向的数据不被修改。
const int* ptr;
-
指针常量(Constant Pointer):指针本身是常量,不能改变指向的地址,但可以修改指向的值。
- 作用:用来确保指针始终指向同一地址。
int* const ptr;
typedef和define有什么区别?
typedef
用于定义类型别名,遵循编译器检查;#define
是预处理宏替换,直接文本替换,无类型检查。
4.野指针是什么
没有初始化的指针,他被随机指向内存中的一块位置
5. C语言中内存分配的方式有几种?
(a)静态存储区分配
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等
(b)栈上分配
在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放局部变量、函数内参数都在栈上
(c) 堆上分配
New开辟的空间在堆上
6.说一说指针的理解,二级指针,三级指针等,对函数指针的理解等。
由于c中存在着内存管理的概念,所以指针应运而生,指针是存储内存地址的变量,二级、三级指针分别存储指针的地址,函数指针存储函数的地址并可用于调用函数。
7.简单说说extern、static、const、voliate的作用
extern
用于声明外部变量或函数,static
用于定义静态变量,比如函数内的局部静态变量,以及限制作用域的全局静态变量,防止其他文件读取,const
定义不可修改的常量,可以用于定义常量、定义常量指针、常量形参等,volatile
避免编译器优化,直接从内存地址读数据而不是寄存器。
8.简单说说指针的运用场景。
1.动态内存管理
2.函数参数传递
3.数组和字符串操作
4.一些数据结构会用到如链表
9.C++11的语法
10.Linux常用指令
常用Linux指令有:
ls
列出目录内容cd
切换目录pwd
显示当前路径cp
复制文件/目录mv
移动或重命名文件/目录rm
删除文件/目录cat
查看文件内容grep
搜索文本chmod
修改权限ps
查看进程top
实时监控系统资源df
查看磁盘使用情况du
查看文件/目录大小ssh
远程登录tar
打包或解包文件
11.简单说说SQL优化和索引结构
SQL优化主要通过减少查询时间和资源消耗实现,常见方法包括:合理使用索引、避免全表扫描、减少子查询、使用连接代替嵌套查询等。
索引结构常见的有两种:
- B+树索引:用于快速查找范围查询、排序,适合大部分场景。
- 哈希索引:用于精确匹配查询,但不支持范围查询。
索引能加快查询速度,但要避免过多索引影响写操作性能。
12. 简单说说多线程
C++多线程通过标准库中的<thread>
实现,允许并发执行多个线程。常用功能包括:
std::thread
:创建和管理线程。- 同步机制:使用
mutex
、lock
、condition_variable
等避免数据竞争和死锁,确保线程安全。 join
与detach
:join
让主线程等待子线程完成,detach
使线程独立执行。- 线程池:可以通过
async
或第三方库创建线程池,提升并发效率。
多线程用于加速计算、处理I/O密集型任务、或实现并行数据处理。
13. 简单说说重写和重载
重写(Override)是子类重新定义父类的虚函数,保持函数签名一致,实现多态。
重载(Overload)是同一作用域内定义多个同名函数,通过不同参数类型或数量区分调用。
14.说说C++中的虚函数和纯虚函数
虚函数是通过virtual
关键字声明的函数,允许子类重写以实现运行时多态。调用时根据对象的实际类型选择合适的函数版本。
纯虚函数(= 0
)是没有实现的虚函数,要求子类必须重写,声明类为抽象类,不能直接实例化。
15. 一个程序从开始运行到结束的完整过程(四个过程)
预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)
16. 计算机中,32bit与64bit有什么区别
64bit计算主要有两大优点:可以进行更大范围的整数运算;可以支持更大的内存寻址。
17. Linux 操作系统关机、重启相关命令
关机:shutdown now 或 poweroff
重启:reboot 或 shutdown -r now
取消关机:shutdown -c
1、改变文件属性的命令:chmod (chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行))
2、查找文件中匹配字符串的命令:grep
3、查找当前目录:pwd
4、删除目录:rm -rf 目录名
5、删除文件:rm 文件名
6、创建目录(文件夹):mkdir
7、创建文件:touch
8、vi和vim 文件名也可以创建
9、解压:tar -xzvf 压缩包
打包:tar -cvzf 目录(文件夹)
18.说一个linux下编译优化选项:
加:-o
10.12日 笔面记录 嵌入式软件开发
笔试很简单
-
考察static的几个用法 给了一段代码 里面有函数内static 全局static 函数static
-
分别在堆、栈以及全局静态空间上申请100个int大小的空间的C语句
栈 即局部变量int arr_stack[100]; // 在栈上分配100个int大小的空间堆 即动态分配内存 需要手动释放内存的int *arr_heap = (int *)malloc(100 * sizeof(int)); // 在堆上分配100个int大小的空间全局静态空间static int arr_global[100]; // 在全局静态空间分配100个int大小的空间或者在全局作用域部分定义
-
写宏 求数组中元素个数
#define Length(table) (sizeof(table) / sizeof(table[0])) -
程序改错
malloc分配时应该是length+1
指针指向数组末尾元素也应该是len-1
复制字符串应该是*d++=s–
*d没有加终止符
malloc的内存没有free -
字符串转整数
-
计算因子之和
面试
1.你在用Linux的时候常用哪些指令?
-
文件和目录操作:
ls
:列出目录内容cd
:切换目录cp
:复制文件或目录mv
:移动或重命名文件rm
:删除文件或目录mkdir
:创建目录touch
:创建空文件或更新文件时间戳
-
文件内容查看:
cat
:显示文件内容more
、less
:分页查看文件内容head
、tail
:查看文件的前几行或后几行grep
:查找文件中的特定字符串find
:查找文件
-
系统管理:
ps
、top
:查看进程信息kill
:结束进程df
、du
:查看磁盘使用情况free
:查看内存使用情况
-
网络配置:
ifconfig
、ip
:查看和配置网络接口ping
:测试网络连通性netstat
:查看网络连接scp
、rsync
:远程文件传输
增、删、改、查对应的指令
-
增(创建)
touch filename
:创建一个空文件mkdir dirname
:创建一个目录echo "text" > filename
:创建一个文件并写入内容cp source destination
:复制文件或目录
-
删(删除)
rm filename
:删除文件rm -r dirname
:删除目录及其内容rmdir dirname
:删除空目录
-
改(修改)
nano filename
、vi filename
、vim filename
:编辑文件内容mv oldname newname
:重命名文件或目录chmod
、chown
:修改文件权限或所有者
-
查(查看)
cat filename
:查看文件内容less filename
:分页查看文件内容grep "pattern" filename
:查找文件中的特定内容find /path -name "filename"
:在指定路径下查找文件
2.epoll了解的多么 你常用到么.
epoll
是 Linux 特有的一种 I/O 多路复用机制,相比于传统的 select
和 poll
,它在性能和可扩展性上有很大优势。主要优点包括:
- 性能更高:
epoll
在处理大量文件描述符时效率更高,因为它不需要像select
一样线性扫描整个文件描述符集合。 - 支持边缘触发(Edge Triggered, ET)和水平触发(Level Triggered, LT),这使得它可以灵活应对不同的 I/O 事件。
- 减少了不必要的系统调用:当有新的 I/O 事件到来时,
epoll
会通知程序,而不像select
或poll
每次都要重新遍历整个文件描述符集合。
2. epoll
的常见使用场景:
- 高并发网络编程:比如设计 HTTP 服务器或者 WebSocket 服务,在处理数千甚至数万的连接时,
epoll
能够高效地监控多个 socket 事件。 - 嵌入式系统的异步 I/O:如果需要同时监控多个传感器、外设或其他 I/O 设备的输入/输出,
epoll
是一个非常好的选择,能够有效地提升系统的响应速度。
3. epoll
的常用函数:
使用 epoll
时,通常会用到以下几个系统调用:
epoll_create
:创建一个epoll
实例,返回一个文件描述符,用于后续的操作。epoll_ctl
:向epoll
实例中添加、修改或删除监听的文件描述符。EPOLL_CTL_ADD
:添加新的文件描述符EPOLL_CTL_MOD
:修改已有文件描述符的监听事件EPOLL_CTL_DEL
:从epoll
实例中移除文件描述符
epoll_wait
:阻塞等待直到一个或多个事件发生,然后将事件返回给用户空间。
3.Socket了解的多么 你怎么理解的?
Socket 是网络编程中最基础的通信机制,它是进程间通信的一种手段,允许两个设备通过网络相互传输数据。在嵌入式系统中,Socket 通常用于设备与服务器之间的通信、远程控制、数据传输等。
服务器端 Socket 流程:
- 创建 Socket:使用
socket()
函数创建一个 Socket,指定协议族(如AF_INET
用于 IPv4)、传输类型(如SOCK_STREAM
用于 TCP)。 - 绑定地址和端口:使用
bind()
函数将创建的 Socket 绑定到本地 IP 地址和端口。 - 监听连接:使用
listen()
函数使 Socket 进入监听模式,等待客户端连接。 - 接受连接:使用
accept()
函数接收客户端的连接请求,返回一个新的 Socket 描述符用于与该客户端进行通信。 - 发送和接收数据:使用
send()
和recv()
函数进行数据传输。 - 关闭 Socket:当通信结束时,使用
close()
函数关闭 Socket。
客户端 Socket 流程:
- 创建 Socket:同样使用
socket()
函数创建一个 Socket。 - 连接服务器:使用
connect()
函数向服务器发起连接请求,连接成功后可以进行数据传输。 - 发送和接收数据:使用
send()
和recv()
函数与服务器进行通信。 - 关闭 Socket:完成数据传输后关闭 Socket。
5. 嵌入式系统中的 Socket 应用
在嵌入式系统中,Socket 被广泛用于以下场景:
- 远程设备管理:通过 TCP/IP 通信,服务器可以远程控制嵌入式设备,收集数据或下发指令。
- 物联网 (IoT) 通信:嵌入式设备作为物联网节点,通过 Socket 进行云端数据上传和下发。
- 实时数据传输:比如,嵌入式传感器数据通过 Socket 传输到中央服务器或处理系统进行进一步的处理和存储。
4.生产者消费者模型是什么 如何用其优化代码?
生产者-消费者模型(Producer-Consumer Model)是一个经典的多线程同步问题,用于解决多线程程序中不同任务之间的协调问题。它广泛应用于缓冲区、队列、流处理等场景,用来协调数据的生成和数据的使用。
1. 基本概念:
生产者-消费者模型中,有两个主要角色:
- 生产者:负责生成数据(任务、消息、资源等),并将其放入共享的缓冲区或队列中。
- 消费者:负责从共享缓冲区中取出数据并进行处理。
这两者通过一个**共享缓冲区(队列)**进行通信。生产者生成的数据存入缓冲区,而消费者从缓冲区中取出数据进行处理。问题在于如何确保两者在高效并发的情况下不会导致资源竞争或缓冲区溢出/空转。
2. 问题的核心挑战:
- 互斥:生产者和消费者不能同时访问缓冲区,防止多个线程对共享资源进行并发访问导致数据不一致。
- 同步:当缓冲区满时,生产者需要等待消费者取走数据;当缓冲区空时,消费者需要等待生产者生成数据。
5.进程间如何通信?
管道 消息队列 共享内存 信号量 套接字 信号
之间的差异
6.多线程要注意什么?
多线程编程需要注意以下几点:
-
线程安全:多个线程访问共享资源时,必须使用同步机制(如锁、互斥量)防止数据竞争和数据不一致。
-
死锁:避免多个线程相互等待资源造成的死锁。使用顺序加锁、尝试加锁或超时机制来预防。
-
上下文切换:频繁切换会带来性能开销,尽量减少不必要的线程切换。
-
资源泄漏:确保每个线程正确释放资源(如内存、文件句柄)。
7.常用的数据结构有哪些?链表有哪几种?
数组 链表 栈 队列 哈希表 树 堆 图
单链表 双向链表 循环链表 双向循环链表
相关文章:

秋招面试题记录
嵌入式软件开发 网上搜集的题目 1.Static关键词的作用? static 关键字有三个主要作用: 局部变量:在函数内部,static 局部变量只初始化一次,且在函数调用结束后仍然保留其值。全局变量/函数:在文件内部&a…...

金字塔流(Pyramid Flow): 用于生成人工智能长视频的新文本-视频开源模型
在 "生成式人工智能 "中的文本生成模型和图像生成模型大行其道之后,现在该是文本-视频模型大显身手的时候了,这个列表中的新模型就是 pyramid-flow-sd3,它是一个开源模型,用于从文本或图像生成长达 10 秒的视频…...

施磊C++ | 进阶学习笔记 | 5.设计模式
五、设计模式 文章目录 五、设计模式1.设计模式三大类型概述一、创建型设计模式二、结构型设计模式三、行为型设计模式 2.设计模式三大原则3.单例模式1.饿汉单例模式2.懒汉单例模式 4.线程安全的懒汉单例模式1.锁双重判断2.简洁的线程安全懒汉单例模式 5.简单工厂(Simple Facto…...

智绘城市地图:使用百度地图 API 实现智能定位
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

【稳定性】稳定性建设之变更管理
作者:京东物流 冯志文 背景 在软件开发和运维领域,变更管理是一个至关重要的环节。无论是对现有系统的改进、功能的增加还是修复漏洞,变更都是不可避免的。这些变更可能涉及到软件代码的修改、配置的调整、服务器的扩容、三方jar包的变更等等…...

c语言中字符串函数strlen,strcmp,strcpy,srtcat,strncpy,strncmp,strncat
1.strlen的使用和模拟实现 strlen 用来求字符串的长度,统计\0之前字符的个数。 模拟实现1:计数参数法 模拟实验2:指针方法 模拟实验3:递归方法 2,strcpy 的使用和模拟实现(拷贝字符串) char*…...

高级SQL技巧
高级SQL技巧涵盖了许多方面,包括但不限于窗口函数、递归查询、公共表表达式(CTEs)、子查询、集合操作、临时函数、日期时间操作、索引优化等。以下是对这些技巧的详细讲解和示例。 窗口函数 窗口函数是一种特殊的SQL函数,能够在…...

新大话西游图文架设教程
开始架设 1. 架设条件 新大话西游架设需要准备: linux 系统服务器,建议 CentOs 7.6或以上版本游戏源码,。 2. 安装宝塔面板 宝塔是一个服务器运维管理软件,安装命令: yum install -y wget && wget -O in…...

Maven 快速入门
Maven 快速入门 一、简介1、概述2、特点3、工作原理4、常用命令5、生命周期6、优缺点🎈 面试题 二、安装和配置1、安装2、环境配置3、命令测试是否安装成功4、功能配置5、idea配置本地 maven6、maven 工程依赖包查询网站 三、基于IDEA创建Maven工程1、maven 工程中的…...

OpenCV-人脸检测
文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了多种人脸检测方法,以下是对OpenCV人脸检测的详细介绍: 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…...

【重磅升级】基于大数据的股票量化分析与预测系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 伴随全球经济一体化和我国经济的快速发展,中国股票市场对世界经济的影响力不断攀升,中国股市已成为全球第二大股票交易市场。在当今的金融市场中,股票价格的波动…...

python全栈学习记录(二十四)元类、异常处理
元类、异常处理 文章目录 元类、异常处理一、元类1.元类控制类的实例化2.属性/方法的查找顺序3.单例 二、异常处理 一、元类 1.元类控制类的实例化 类的__call__方法会在产生的对象被调用时自动触发,args和kwargs就是调用实例时传入的参数,返回值是调用…...

Golang Slice扩容机制及注意事项
Golang Slice扩容机制及注意事项: 在 Go语言中,Slice(切片)是一种非常灵活且强大的数据结构,它是对数组的抽象,提供了动态数组的功能。Slice 的扩容机制是自动的,但了解其背后的原理对于编写高…...

华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...

Flink触发器Trigger
前言 在 Flink 窗口计算模型中,数据先经过 WindowAssigner 分配窗口,然后再经过触发器 Trigger,Trigger 决定了一个窗口何时被 ProcessFunction 处理。每个 WindowAssigner 都有一个默认的 Trigger,如果默认的不满足需求…...

【操作系统的使用】Linux 系统环境变量与服务管理:设置与控制的艺术
文章目录 系统环境变量与服务管理:设置与控制的艺术一、系统环境变量的设置1.1 临时设置环境变量1.2 永久设置环境变量 二、服务启动类型的设置2.1 查看服务状态2.2 启动和停止服务2.3 设置服务的启动类型2.3.1 设置服务在启动时运行2.3.2 禁用服务在启动时运行2.3.…...

速盾:高防cdn配置中性能优化是什么?
高防CDN配置中的性能优化是指通过调整CDN配置以提升网站的加载速度、响应时间和用户体验。在进行性能优化时,需要考虑多个因素,包括CDN节点的选择和布置、缓存策略、缓存过期时间、预取和预加载、并发连接数和网络延迟等。 首先,CDN节点的选…...

Qt_软件添加版本信息
文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO...

mallocfree和newdelete的区别
malloc\free和new\delete的区别 malloc/free new/delete 身份: 函数 运算符\关键字 返回值: void* 带类型的指针 参数: 字节个数(手动计算) 类型 自动计算字节数 处理数组: 手动计算数组总字节数 new 类型[数量] 扩容࿱…...

无锁队列实现(Michael Scott),伪代码与c++实现
一、Michael & Scoot 原版伪代码实现 structure pointer_t {ptr: pointer to node_t, count: unsigned integer}structure node_t {value: data type, next: pointer_t}structure queue_t {Head: pointer_t, Tail: pointer_t}initialize(Q: pointer to queue_t)node new_…...

猜数字小游戏
前言 猜数字游戏是一款经典且简单的互动游戏,常常用于提高逻辑思维能力和锻炼数学技巧。本文将深入探讨一段用 JavaScript 编写的猜数字游戏代码,帮助读者理解游戏的基本逻辑和实现方法。这段代码不仅适合初学者练习编程技巧,也是了解用户交…...

在Windows上搭建ChatTTS:从本地部署到远程AI音频生成全攻略
文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目,并且我们还可以结合Cpolar内网穿透工具创建公网地址,随时随…...

如何用好 CloudFlare 的速率限制防御攻击
最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…...

Unity3D 立方体纹理与自制天空盒详解
立方体纹理和自制天空盒是游戏开发中常用的技术之一,可以为游戏增添更加丰富的视觉效果。在本文中,我们将详细介绍Unity3D中立方体纹理和自制天空盒的使用方法,并给出相应的代码实现。 对惹,这里有一个游戏开发交流小组ÿ…...

【工具】VSCODE下载,配置初次设置
打开 settings.json 文件,包含了 Visual Studio Code (VSCode) 中的各种用户配置。 {"files.associations": {"*.vue": "vue","*.wpy": "vue","*.wxml": "html","*.wxss": "…...

vue使用jquery的ajax,页面跳转
一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 (…...

基于微信小程序的社区二手交易系统的详细设计和实现(源码+lw+部署文档+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...

D34【python 接口自动化学习】- python基础之输入输出与文件操作
day34 文件关闭 学习日期:20241011 学习目标:输入输出与文件操作﹣-46 常见常新:文件的关闭 学习笔记: 文件关闭的内部工作过程 close()函数 with语句 常用的打开关闭文件 # 文件关闭 # 方式…...

【Linux系列】set -euo pipefail 命令详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 (一)匹配单个中文字符 (二…...