秋招面试题记录

news2024/10/19 2:55:58

嵌入式软件开发 网上搜集的题目

1.Static关键词的作用?

static 关键字有三个主要作用:

  1. 局部变量:在函数内部,static 局部变量只初始化一次,且在函数调用结束后仍然保留其值。
  2. 全局变量/函数:在文件内部,static 限制全局变量或函数的作用域,使其仅对当前文件可见。
  3. 类成员:在类中,static 成员变量或函数属于类本身而非某个对象,可以不通过对象访问。

好的,我将通过三个简短的代码示例来解释 static 关键字的三个主要作用:

1. 局部变量的 static 作用

在函数内部,static 局部变量的值在多次调用中保持不变,并且只初始化一次。

#include <iostream>
void counter() {
    static int count = 0;  // 只初始化一次
    count++;
    std::cout << "Count: " << count << std::endl;
}

int main() {
    counter();  // 输出 Count: 1
    counter();  // 输出 Count: 2
    counter();  // 输出 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 在此不可访问

解释hiddenVarhiddenFunc 只能在 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:创建和管理线程。
  • 同步机制:使用mutexlockcondition_variable等避免数据竞争和死锁,确保线程安全。
  • joindetachjoin让主线程等待子线程完成,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日 笔面记录 嵌入式软件开发

笔试很简单

  1. 考察static的几个用法 给了一段代码 里面有函数内static 全局static 函数static

  2. 分别在堆、栈以及全局静态空间上申请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大小的空间
     
     或者在全局作用域部分定义
    
  3. 写宏 求数组中元素个数
    #define Length(table) (sizeof(table) / sizeof(table[0]))

  4. 程序改错
    在这里插入图片描述
    malloc分配时应该是length+1
    指针指向数组末尾元素也应该是len-1
    复制字符串应该是*d++=s–
    *d没有加终止符
    malloc的内存没有free

  5. 字符串转整数

  6. 计算因子之和

面试

1.你在用Linux的时候常用哪些指令?

  1. 文件和目录操作

    • ls:列出目录内容
    • cd:切换目录
    • cp:复制文件或目录
    • mv:移动或重命名文件
    • rm:删除文件或目录
    • mkdir:创建目录
    • touch:创建空文件或更新文件时间戳
  2. 文件内容查看

    • cat:显示文件内容
    • moreless:分页查看文件内容
    • headtail:查看文件的前几行或后几行
    • grep:查找文件中的特定字符串
    • find:查找文件
  3. 系统管理

    • pstop:查看进程信息
    • kill:结束进程
    • dfdu:查看磁盘使用情况
    • free:查看内存使用情况
  4. 网络配置

    • ifconfigip:查看和配置网络接口
    • ping:测试网络连通性
    • netstat:查看网络连接
    • scprsync:远程文件传输

增、删、改、查对应的指令

  1. 增(创建)

    • touch filename:创建一个空文件
    • mkdir dirname:创建一个目录
    • echo "text" > filename:创建一个文件并写入内容
    • cp source destination:复制文件或目录
  2. 删(删除)

    • rm filename:删除文件
    • rm -r dirname:删除目录及其内容
    • rmdir dirname:删除空目录
  3. 改(修改)

    • nano filenamevi filenamevim filename:编辑文件内容
    • mv oldname newname:重命名文件或目录
    • chmodchown:修改文件权限或所有者
  4. 查(查看)

    • cat filename:查看文件内容
    • less filename:分页查看文件内容
    • grep "pattern" filename:查找文件中的特定内容
    • find /path -name "filename":在指定路径下查找文件

2.epoll了解的多么 你常用到么.

epoll 是 Linux 特有的一种 I/O 多路复用机制,相比于传统的 selectpoll,它在性能和可扩展性上有很大优势。主要优点包括:

  • 性能更高epoll 在处理大量文件描述符时效率更高,因为它不需要像 select 一样线性扫描整个文件描述符集合。
  • 支持边缘触发(Edge Triggered, ET)和水平触发(Level Triggered, LT),这使得它可以灵活应对不同的 I/O 事件。
  • 减少了不必要的系统调用:当有新的 I/O 事件到来时,epoll 会通知程序,而不像 selectpoll 每次都要重新遍历整个文件描述符集合。

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 流程
  1. 创建 Socket:使用 socket() 函数创建一个 Socket,指定协议族(如 AF_INET 用于 IPv4)、传输类型(如 SOCK_STREAM 用于 TCP)。
  2. 绑定地址和端口:使用 bind() 函数将创建的 Socket 绑定到本地 IP 地址和端口。
  3. 监听连接:使用 listen() 函数使 Socket 进入监听模式,等待客户端连接。
  4. 接受连接:使用 accept() 函数接收客户端的连接请求,返回一个新的 Socket 描述符用于与该客户端进行通信。
  5. 发送和接收数据:使用 send()recv() 函数进行数据传输。
  6. 关闭 Socket:当通信结束时,使用 close() 函数关闭 Socket。
客户端 Socket 流程
  1. 创建 Socket:同样使用 socket() 函数创建一个 Socket。
  2. 连接服务器:使用 connect() 函数向服务器发起连接请求,连接成功后可以进行数据传输。
  3. 发送和接收数据:使用 send()recv() 函数与服务器进行通信。
  4. 关闭 Socket:完成数据传输后关闭 Socket。

5. 嵌入式系统中的 Socket 应用

在嵌入式系统中,Socket 被广泛用于以下场景:

  • 远程设备管理:通过 TCP/IP 通信,服务器可以远程控制嵌入式设备,收集数据或下发指令。
  • 物联网 (IoT) 通信:嵌入式设备作为物联网节点,通过 Socket 进行云端数据上传和下发。
  • 实时数据传输:比如,嵌入式传感器数据通过 Socket 传输到中央服务器或处理系统进行进一步的处理和存储。

4.生产者消费者模型是什么 如何用其优化代码?
生产者-消费者模型(Producer-Consumer Model)是一个经典的多线程同步问题,用于解决多线程程序中不同任务之间的协调问题。它广泛应用于缓冲区、队列、流处理等场景,用来协调数据的生成数据的使用

1. 基本概念

生产者-消费者模型中,有两个主要角色:

  • 生产者:负责生成数据(任务、消息、资源等),并将其放入共享的缓冲区或队列中。
  • 消费者:负责从共享缓冲区中取出数据并进行处理。

这两者通过一个**共享缓冲区(队列)**进行通信。生产者生成的数据存入缓冲区,而消费者从缓冲区中取出数据进行处理。问题在于如何确保两者在高效并发的情况下不会导致资源竞争或缓冲区溢出/空转。

2. 问题的核心挑战

  • 互斥:生产者和消费者不能同时访问缓冲区,防止多个线程对共享资源进行并发访问导致数据不一致。
  • 同步:当缓冲区满时,生产者需要等待消费者取走数据;当缓冲区空时,消费者需要等待生产者生成数据。

5.进程间如何通信?

管道 消息队列 共享内存 信号量 套接字 信号
之间的差异

6.多线程要注意什么?

多线程编程需要注意以下几点:

  1. 线程安全:多个线程访问共享资源时,必须使用同步机制(如锁、互斥量)防止数据竞争和数据不一致。

  2. 死锁:避免多个线程相互等待资源造成的死锁。使用顺序加锁、尝试加锁或超时机制来预防。

  3. 上下文切换:频繁切换会带来性能开销,尽量减少不必要的线程切换。

  4. 资源泄漏:确保每个线程正确释放资源(如内存、文件句柄)。

7.常用的数据结构有哪些?链表有哪几种?

数组 链表 栈 队列 哈希表 树 堆 图
单链表 双向链表 循环链表 双向循环链表

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

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

相关文章

产品自问:前台和中后台

产品自问&#xff1a;前台和中后台 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 前台和中后台通常根据以下几个方面进行区分&#xff1a; 一、功能定位 前台&#xff1a;主要面向外部…

redo文件误删除后通过逻辑备份进行恢复

问题描述 开发同事让在一个服务器上查找下先前库的备份文件是否存在&#xff0c;如果存在进行下恢复。翻了服务器发现备份文件存在&#xff0c;多愁了一眼竟翻到了该备份文件于2024.6.17日恢复过的日志&#xff0c;赶紧和开发沟通说2024.6.17号已经恢复过了为啥还要恢复&#x…

【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)

目录 Anaconda下载 Anaconda安装 conda init conda --v Conda 配置 conda 环境创建 conda info --envs conda list Pytorch安装配置 检验安装情况 检验是否可以使用GPU Anaconda下载 可以通过两种途径完成Anaconda安装包的下载 途径一&#xff1a;本地windows下…

了解静态存储方式和动态存储方式的区别(超详细讲解)快来看

本篇通过一个代码题来考察静态变量和动态变量的区别&#xff0c;主要考察静态变量的值。 在前2章我们讲了变量可以分为全局变量和局部变量&#xff0c;而我们的变量&#xff0c;它的存储又有两种不同的方式:静态存储方式与动态存储方式。 自动局部变量:auto 静态局部变量:stati…

emwin的异常显示和父子坐标问题(瞎写的,别看 -- 2)

文章目录 4&#xff0c;想显示成 最后的demo 仿真器中 1&#xff0c;格子状显示 把下面这句注释掉&#xff0c;就可能会这么显示 WM_SetCreateFlags(WM_CF_MEMDEV);2&#xff0c;显示一副灰度图 很有可能你是这么写的 也就是 hMemDev GUI_MEMDEV_CreateFixed(0, 0, 200, …

Redis-02 单线程与高性能

Redis是单线程吗&#xff1f; Redis不是只有一个线程&#xff0c;通常所说Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数…

BGP(边界网关协议)

1、网络AS&#xff08;自治系统&#xff09; 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。 AS是指在一个实体管辖下的拥有…

【c++并发编程】线程池实现

参考https://shanhai.huawei.com/#/page-forum/post-details?postId43796 完整代码 #include <iostream> #include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functi…

牛企查:性价比很高的企业综合查询小程序

很多人都会有查询企业信息的需求&#xff1a; 入职公司前查询企业的基本信息&#xff1b; 只是需要简单便捷查询到企业的信用代码注册地址等基础信息&#xff1b; 做企业调查&#xff0c;分析时需要用到企业的一些数据&#xff1b; 研究一些单项数据的时候&#xff0c;需要…

拟声 0.37.0 | 拟物风格,超级优美,功能丰富

拟声是一款功能丰富的音视频播放器&#xff0c;支持多种音频来源&#xff0c;并具备独特的歌词弹幕、音源转换、跨设备共享与控制等功能。其创新的LRC歌词编解码器和新拟物风格的UI设计为用户提供了一个全新的视听体验。 大小&#xff1a;36M 百度网盘&#xff1a;https://pan…

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

27.第二阶段x86游戏实战2-遍历周围NPC跳出递归循环

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01;0 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

公开课 | 2024清华大模型公开课 第6课 大模型前沿架构 Part 2(长文本、Scaling Law)

本文由readlecture.cn转录总结专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 大纲 引言 介绍长文本和Scaling Law的研究方向 强调大型语言模型在日常生活中的应用 长文本处理 长文本的定义和例子 《哈利波特》系列书…

KubeSphere安装mysql8.4.0

背景 KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台,完全开源,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面&#xff0c;帮助企业快速构建一个强大和功能丰富的容器云平台。 安装组件前提&am…

Metasploit渗透测试之攻击终端设备和绕过安全软件

概述 在之前&#xff0c;重点讨论了针对服务器端的利用。但在当下&#xff0c;最成功的攻击都是针对终端的&#xff1b;原因是&#xff0c;随着大部分安全预算和关注都转向面向互联网的服务器和服务&#xff0c;越来越难找到可利用的服务&#xff0c;或者至少是那些还没有被破…

阿里商品发布框架如何覆盖海量规则

1688商品发布系统升级发品框架GPF&#xff0c;面对商品模型复杂度极高&#xff0c;发布的海量场景、多重业务逻辑如何覆盖&#xff1f; 本文从手工测试到自动化测试&#xff0c;以及完善的质量保障方案一一解答。 1、项目背景 1688商品发布系统运行多年&#xff0c;架构逐步…

OFDM学习-IP核学习-FIFO IP核和FFT IP核在vavido中的配置以及使用

FIFO IP核和FFT IP核在vavido中的配置以及使用 前言一、FFT IP核配置过程二、FIFO IP核配置过程总结 前言 记录一下OFDM学习中遇到的ip核使用方法&#xff0c;个人之前主要用Quatus&#xff0c;之前用ip核也比较少&#xff0c;记录一下配置过程吧以及一些参数的含义&#xff0…

【linux】Microsoft Edge 的 Bookmarks 文件存储位置

在 Linux 系统中&#xff0c;Microsoft Edge 的书签&#xff08;Bookmarks&#xff09;文件存储在用户的配置目录下。具体路径通常如下&#xff1a; ~/.config/microsoft-edge/Default/Bookmarks说明&#xff1a; 路径解释&#xff1a; ~ 表示当前用户的主目录。.config 是一个…

代替AD作为身份认证组件,深信服零信任aTrust与宁盾身份目录实现互操作

9月25日&#xff0c;经深信服科技股份有限公司和上海宁盾信息科技有限公司共同严格测试&#xff1a;宁盾身份目录服务软件能够与深信服零信任访问控制系统 aTrust 兼容对接运行&#xff0c;双方相互兼容&#xff0c;共同为企事业单位提供身份和零信任管理需求。 本次测试包含了…