嵌入式知识点学习篇五(C\C++)

嵌入式知识点学习篇五(C\C++)

变量/函数

全局变量和静态变量的区别是什么?

  1. 全局变量的作用域为程序块,而局部变量的作用域为当前函数。
  2. 内存存储方式不同,全局变量(静态全局变量,静态局部变量)分配在全局数据区(静态存储空间),后者分配在栈区。
  3. 生命周期不同。全局变量随主程序创建而创建,随主程序销毁而销毁,局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在了。
  4. 使用方式不同。通过声明为全局变量,程序的各个部分都可以用到,而局部变量只能在局部使用。

全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

局部变量能否和全局变量重名?

能,局部会屏蔽全局。

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。

对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

为什么析构函数必须是虚函数?

将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

为什么C++默认的析构函数不是虚函数?

C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。

C++中析构函数的作用?

如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。

析构函数也是特殊的类成员函数。简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。

静态函数和虚函数的区别?

静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。

重载和覆盖有什么区别?

  1. 覆盖是子类和父类之间的关系,垂直关系;重载同一个类之间方法之间的关系,是水平关系。
  2. 覆盖只能由一个方法或者只能由一对方法产生关系;重载是多个方法之间的关系。
  3. 覆盖是根据对象类型(对象对应存储空间类型)来决定的;而重载关系是根据调用的实参表和形参表来选择方法体的。

虚函数表具体是怎样实现运行时多态的?

原理:
虚函数表是一个类的虚函数的地址表,每个对象在创建时,都会有一个指针指向该类虚函数表,每一个类的虚函数表,按照函数声明的顺序,会将函数地址存在虚函数表中,当子类对象重写父类的虚函数的时候,父类的虚函数表中对应的位置会被子类的虚函数地址覆盖。

作用:
在用父类的指针调用子类对象成员函数时,虚函数表会指明要调用的具体函数是哪个。

C语言是怎么进行函数调用?

大多数CPU上的程序实现使用栈来支持函数调用操作,栈被用来传递函数参数、存储返回信息、临时保存寄存器原有的值以备恢复以及用来存储局部变量。

函数调用操作所使用的栈部分叫做栈帧结构,每个函数调用都有属于自己的栈帧结构,栈帧结构由两个指针指定,帧指针(指向起始),栈指针(指向栈顶),函数对大多数数据的访问都是基于帧指针。下面是结构图:

在这里插入图片描述


栈指针和帧指针一般都有专门的寄存器,通常使用ebp寄存器作为帧指针,使用esp寄存器做栈指针。
帧指针指向栈帧结构的头,存放着上一个栈帧的头部地址,栈指针指向栈顶。

请你说一说select

  1. select函数原型
intselect(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,structtimeval*timeout);
  1. 文件描述符的数量
    单个进程能够监视的文件描述符的数量存在最大限制,通常是1024,当然可以更改数量;(在linux内核头文件中定义:#define __FD_SETSIZE 1024)。
  2. 就绪fd采用轮询的方式扫描
    select返回的是int,可以理解为返回的是ready(准备好的)一个或者多个文件描述符,应用程序需要遍历整个文件描述符数组才能发现哪些fd句柄发生了事件,由于select采用轮询的方式扫描文件描述符(不知道那个文件描述符读写数据,所以需要把所有的fd都遍历),文件描述符数量越多,性能越差。
  3. 内核 /用户空间内存拷贝
    select每次都会改变内核中的句柄数据结构集(fd集合),因而每次调用select都需要从用户空间向内核空间复制所有的句柄数据结构(fd集合),产生巨大的开销。
  4. select的触发方式
    select的触发方式是水平触发,应用程序如果没有完成对一个已经就绪的文件描述符进行IO操作,那么之后每次调用select还是会将这些文件描述符通知进程。
  5. 优点
    a. select的可移植性较好,可以跨平台;
    b. select可设置的监听时间timeout精度更好,可精确到微秒,而poll为毫秒。
  6. 缺点
    a. select支持的文件描述符数量上限为1024,不能根据用户需求进行更改;
    b. select每次调用时都要将文件描述符集合从用户态拷贝到内核态,开销较大;
    c. select返回的就绪文件描述符集合,需要用户循环遍历所监听的所有文件描述符是否在该集合中,当监听描述符数量很大时效率较低。

请你说说fork,wait,exec函数

父进程产生子进程使用fork拷贝出来一个父进程的副本,此时只拷贝了父进程的页表,两个进程都读同一块内存,当有进程写的时候使用写实拷贝机制分配内存,exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。fork从父进程返回子进程的pid,从子进程返回0,调用了wait的父进程将会发生阻塞,直到有子进程状态改变,执行成功返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1。

Read more

C++ 日志系统实战第一步:项目功能与技术架构详解

C++ 日志系统实战第一步:项目功能与技术架构详解

C++-基于多设计模式下的同步&异步日志系统 全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~    (全文手敲,受益良多) 本人也是做到项目了,后面会日更项目笔记。  我们要实现日志系统,先了解 什么是日志?    程序运行过程中所记录的程序运行的状态信息。为什么要这些信息呢?便于程序员对程序运行状况判断,进而分析,修改代码子类的。所以 日志作用:记录了程序运行状态信息,便于程序员能够随时根据状态信息,对系统的运行状态,进行分析 项目功能:能够让用户非常简便的进行日志的输出,及其控制。 一.项目介绍 本项目主要实现一个日志系统,其主要支持以下功能: 支持多级别日志消息:(级别有:调试,提示,警告,错误,致命,不同级别对应不同场景:例如调试级别的日志不输出…)  支持同步日志和异步日志:(同步指的是该工作由自己干,异步指的是该工作由别人干,自己等结果就行)同步日志指的是将日志写入到文件或数据库中去,这个操作由业务线程自己完成。异步日志指的是,将日志放到内存中去,由于担心磁盘满了,

By Ne0inhk
【C++初阶】:C++入门相关知识(3):引用 & inline内联函数 & nullptr相关概念

【C++初阶】:C++入门相关知识(3):引用 & inline内联函数 & nullptr相关概念

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 前言:在上一篇文章中,我们学习了C++的输入输出,缺省参数以及函数重载,这些都是C++入门必备的基础知识,那么在这篇文章中,我们就要来学习剩下C++其他的基础知识,那就是引用、inline、以及nullptr这些知识。 一、引用 1.1、引用的概念和定义 引用不是定义一个新变量,而是给已经存在的变量起一个别名,那么编译器就不会为别名重新开辟空间,它和引用变量共同使用同一块空间。就好比我们把土豆称为马铃薯,番茄称为西红柿一样,都是取了一个新的别名,但是东西是同一个东西,所以引用的语法如下: 类型& 别名 = 变量 使用方法如下: int a = 10; int&

By Ne0inhk
【C++】priority_queue和deque的使用与实现

【C++】priority_queue和deque的使用与实现

priority_queue与deque的使用与模拟实现 ✨前言:在C++ STL中,priority_queue和deque是两个重要的容器适配器,它们分别基于堆和双端队列的概念,为不同的应用场景提供了高效的解决方案。本文将深入探讨它们的使用方法、底层实现原理以及在实际开发中的应用选择。 📖专栏:【C++成长之旅】 目录 * priority_queue与deque的使用与模拟实现 * 一、priority_queue * 1.1 介绍 * 1.2 使用 * 1.3 模拟实现 * 二、deque * 2.1 介绍 * 2.2 缺陷 * 三、STL标准库中对于stack和queue的模拟实现 * 3.1 为什么选择deque作为stack和queue的底层默认容器 * 3.2 stack的模拟实现 * 3.3 queue的模拟实现 一、priority_

By Ne0inhk
计算机毕设java电子商务网站的设计与实现 基于Spring Boot的在线购物平台开发与实现 Java技术驱动的B2C网络商城系统构建

计算机毕设java电子商务网站的设计与实现 基于Spring Boot的在线购物平台开发与实现 Java技术驱动的B2C网络商城系统构建

计算机毕设java电子商务网站的设计与实现4940z9(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着互联网技术的飞速发展和移动支付的普及,电子商务已成为推动经济增长的重要引擎。传统零售模式面临渠道单一、运营成本高昂、客户触达受限等困境,而线上购物以其便捷性、多样性和价格优势赢得了消费者的青睐。与此同时,中小企业数字化转型需求迫切,亟需低成本、高效率的电商解决方案来拓展销售渠道、提升品牌影响力。然而,市面上成熟的电商平台往往存在入驻费用高、数据归属不清、功能同质化等问题,难以满足个性化运营需求。基于此,采用Java语言结合Spring Boot框架,开发一套电子商务网站,通过B/S架构实现商品展示、在线交易、订单管理、用户互动等核心功能,旨在为商家提供自主可控的线上销售平台,为消费者打造安全便捷的购物体验,助力数字经济的普惠发展。 系统功能模块 本系统采用Spring Boot作为后端开发框架,数据库选用MySQL进行数据存储,基于B/S架构设计。系统涵盖以下核心功能模块: 用户管理模块:实现用户基

By Ne0inhk