C/C++、嵌入式知识整理
文章平均质量分 73
操作系统面试相关知识点
子木呀
这个作者很懒,什么都没留下…
展开
-
二十万字C/C++、嵌入式软开面试题全集宝典五
81、 vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间?1.通过下标访问vector中的元素时不会做边界检查,即便下标越界。也就是说,下标与first迭代器相加的结果超过了finish迭代器的位置,程序也不会报错,而是返回这个地址中存储的值。如果想在访问vector中的元素时首先进行边界检查,可以使用vector中的at函数。通过使用at函数不但可以通过下标访问vector中的元素,而且在at函数内部会对下标进行边界检查。2.map的...原创 2021-10-04 16:48:08 · 902 阅读 · 0 评论 -
二十万字C/C++、嵌入式软开面试题全集宝典四
目录1、 虚函数的代价?2、 用C语言实现C++的继承3、 继承机制中对象之间如何转换?指针和引用之间如何转换?4、 C++四种类型转换5、 为什么要用static_cast转换而不用c语言中的转换?6、 组合与继承优缺点?7、 左值右值8、 总结左值和右值的概念9、 移动构造函数10、 C语言的编译链接过程?11、 vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素12、 STL vector的实现,删除其中的元素,迭代器如原创 2021-10-04 16:37:09 · 1111 阅读 · 0 评论 -
C++类对象在内存中的布局
目录一、前言二、C++ 类对象的内存布局2.1 只有数据成员的对象2.2 没有虚函数的对象2.3 拥有仅一个虚函数的类对象2.4 拥有多个虚函数的类对象三、继承关系中的C++类对象内存分布3.1 存在继承关系且本身不存在虚函数的派生类的内存布局3.2本身不存在虚函数(不严谨)但存在基类虚函数覆盖的单继承类的内存布局3.3 定义了基类没有的虚函数的单继承的类对象布局3.4 多继承且存在虚函数覆盖同时又存在自身定义的虚函数的类对象布局3.5如果第1个直接基...原创 2021-09-26 13:28:39 · 3091 阅读 · 5 评论 -
C++类对象中虚函数表指针、虚函数表、虚函数之间的关系以及在内存中的布局
目录C++类的虚函数表和虚函数在内存中的位置虚函数表和虚函数在内存中的位置说明结论原文C++类的虚函数表和虚函数在内存中的位置_JMW1407的博客-CSDN博客C++类的虚函数表和虚函数在内存中的位置关系:虚函数表指针(保存在堆或栈)->虚函数表(常量区.rodata)->虚函数(代码段 .text)虚函数表指针是虚函数表所在位置的地址。虚函数表指针属于对象实例。因而通过new 出来的对象的虚函数表指针位于堆,声名对象的虚函数表指针位于栈。总结:1...原创 2021-09-26 13:27:19 · 1005 阅读 · 1 评论 -
详解操作系统中虚拟内存与物理内存的关系
点击链接阅读更多:一文理解虚拟内存、物理内存、内存分配、内存管理 - 知乎目录一、虚拟内存与物理内存1.1 虚拟内存1.2 虚拟内存与物理内存二、C/C++中虚拟内存分配模型2.1 C语言中内存分配模型2.2 C++语言中内存分配模型三、程序占用的内存是虚拟内存还是物理内存3.1 内存管理3.1.1 内存管理概念3.1.2 glibc内存管理器3.1.3 内存管理器面临的困难3.1.4 以堆为例讲解内存的申请与释放3.2 代码占用的内存3.2.原创 2021-09-25 22:39:04 · 7376 阅读 · 0 评论 -
详解进程的虚拟内存,物理内存,共享内存
目录写在前面:一、关于内存的两个概念1.1 虚拟内存1.2 驻留内存二、详解top命令中VIRT、RES和SHR2.1 top命令中ⅥRT、RES和SHR的含义三、进程的smaps文件写在前面:想必在Linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题,你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过top命令查看进程占用了多少内存。这里我们可以看到VIRT、RES和SHR三个重要的指标,他们分别代表什么意思呢?这是本文需要跟.原创 2021-09-25 22:37:25 · 11275 阅读 · 4 评论 -
为什么HTTP3.0使用UDP协议
目录1. 前言2.HTTP2.0和HTTP3.02.1 HTTP2.0和TCP的爱恨纠葛2.2 谷歌为什么选择UDP2.3 QUIC协议和HTTP3.03. QUIC协议详解3.1 队头阻塞问题3.2 0RTT 建链3.3 首次连接和非首次连接3.4 前向安全问题3.5 前向纠错3.6 连接迁移4. QUIC的应用和前景5.本文小结1. 前言通过本文你将了解到以下内容: HTTP2.0和TCP存在的一些问题 QUIC协议为什么原创 2021-09-25 22:34:51 · 503 阅读 · 0 评论 -
链表反转相关的题(C++模板)
目录反转单链表反转部分单链表K个一组反转单链表K个一组反转单链表(从尾结点开始)反转单链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULLclassSolution{public:ListNode*reverseList(ListNode*head){if(he...原创 2021-09-25 22:33:37 · 237 阅读 · 0 评论 -
详解mmap:是什么 为什么 怎么用
目录mmap基础概念mmap内存映射原理mmap和常规文件操作的区别mmap优点总结mmap相关函数mmap使用细节性能总结mmap基础概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空原创 2021-09-25 22:32:15 · 2577 阅读 · 0 评论 -
malloc()背后的实现原理——内存池
目录malloc()和free()的分配算法内存池池化技术相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而且申请的大小从几个字节到几个GB都有可能,我们不能假设程序一次申请多少堆空间,因此,堆的管理显得较为复杂。那么,使用 malloc() 在堆上分配内存到底是如何实现的呢?一种做法是把 malloc() 的内存管理交给系统内核去做,既然内核管理着进程的地址空间,那么如果它提供一个系统调用,可以让原创 2021-09-25 22:29:53 · 1331 阅读 · 0 评论 -
linux中fork函数及子进程父进程执行顺序
目录一、fork入门知识二、fork进阶知识一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。我们来看一个例子:...原创 2021-09-25 21:56:01 · 16134 阅读 · 2 评论 -
sizeof()与strlen()
sizeof()可以计算所有类型,strlen()仅计算字符串。sizeof计算对象所占内存字节数,strlen()计算字符个数,遇到'\0'截止。char *a;char b[5];sizeof(a) = 8 ; // 64位系统,8代表的是指针的大小,指针占8字节sizeof(b) = 5 ; // 计算字符串数组的结果是真实的字符数组大小//strlen(a) strlen(b) // 无固定值,因为strlen判断的唯一标准是'\0',//它会根据a...原创 2021-09-25 21:54:33 · 287 阅读 · 0 评论 -
详解2021华为笔试三道编程题
目录2021华为笔试第一道缓存转发数据包统计(100%)解题思路:参考代码:2021华为笔试第二题查找知识图谱中的实例知识(100%)解题思路:参考代码:2021华为笔试第三题湖泊连通(100%)解题思路:参考代码:2021华为笔试第一道缓存转发数据包统计(100%)题目描述有k个节点的转发队列,每个节点转发能力为m,缓存能力n(表示此节点可立即转发m个包,剩余的缓存,最多缓存n个包,再剩余的丢弃,缓存的包在下一轮继续转发)。另外,此队列..原创 2021-09-25 21:52:50 · 5156 阅读 · 1 评论 -
青蛙跳台阶扩展问题
原题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。class Solution {public: int numWays(int n) { int p = 0, q = 0, r = 1;//初始化p为0 q为f(0)==0 r为f(1)==1 //p q r分别指f(x - 2) f(x - 1)原创 2021-09-25 21:50:53 · 163 阅读 · 0 评论 -
FIFO缓存区设计
目录1.缓存区的制作2 改善上述缓存区3 缓存区的实现1.FIFO (First Input First Output)一种先进先出的数据缓存器,先进入的数据先从FIFO缓存器中读出,与RAM相比没有外部读写地址线,使用比较简单,但只能顺序写入数据,顺序的读出数据,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。2.FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端是AD数据采集,另一端为PCI总线,那么在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外.原创 2021-09-15 21:47:59 · 4259 阅读 · 1 评论 -
Linux C++多线程同步的四种方式
原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题?通过多线程模拟多窗口售票为例:#include <iostream>#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>using n原创 2021-09-15 15:17:30 · 815 阅读 · 0 评论 -
B树与B+树 两者的区别
一个m阶的B树具有如下几个特征: 根结点至少有两个子女。 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m 所有的叶子结点都位于同一层。 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。 一个m阶的B+树具有如下几个特征: 有k个子树的中间节点包含有k个元素(B树中是k-1个元素...原创 2021-09-13 12:13:17 · 660 阅读 · 0 评论 -
N皇后问题
目录N皇后规则回溯三部曲N皇后C++完整代码链接:https://leetcode-cn.com/problems/n-queens/solution/dai-ma-sui-xiang-lu-51-n-queenshui-su-fa-2k32/都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二位矩阵还会有点不知所措。N皇后规则n皇后问题 研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。..原创 2021-09-11 16:12:12 · 358 阅读 · 0 评论 -
C++中NULL和nullptr的区别
在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。一、C程序中的NULL在C语言中,NULL通常被定义为:#define NULL ((void *)0)所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的原创 2021-09-11 10:09:19 · 1101 阅读 · 0 评论 -
HTTPS 建立连接的详细过程
目录原文链接:HTTPS 建立连接的详细过程 - cccc_hi - 博客园简介对称加密和非对称加密建立连接tcp的三次挥手和四次挥手HTTP请求过程HTTPS原文链接:HTTPS 建立连接的详细过程 - cccc_hi - 博客园简介HTTPS是在HTTP的基础上和ssl/tls证书结合起来的一种协议,保证了传输过程中的安全性,减少了被恶意劫持的可能.很好的解决了解决了http的三个缺点(被监听、被篡改、被伪装)对称加密和非对称加密 对称加密 即加原创 2021-09-10 23:36:50 · 857 阅读 · 0 评论 -
stringstream用法总结
目录一、概念二、基本功能功能一:预定的格式将程序中的数据保存在一个string 中功能二:实现类型转换功能三:实现任意类型转换三、重要功能1.数字由空格或逗号分开。2.数字由逗号分开3.数字间不止一类符号分隔一、概念C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。istringstream类用于执行C++风格的串流的输入操作。ost...原创 2021-09-06 16:49:00 · 7018 阅读 · 0 评论 -
Ubuntu下使用VSCode的launch.json及tasks.json编写
目录程序调试遇到的问题及解决方式拓展预定义变量#预定义变量示例:tasks用于在launch前执行任务,launch用于读取执行文件。这两者经常组合起来用于需要编译语言的自动编译+自动执行,下面以C++、Rust和Typescript为例。程序工作区包含main.cpp、头文件夹include以及文件夹中的h文件、src文件夹以及文件夹中的cpp文件。.vscode是后面生成的,不用管。在swap.h文件中对类进行了声明,在swap对类进行了定义.原创 2021-08-30 12:24:31 · 3008 阅读 · 0 评论 -
linux系统-软链接与硬链接区别
引言在介绍硬链接和软链接之前,首先介绍下硬盘相关的知识,主要是了解下 inode 。硬盘硬盘设备是由大量的扇区组成的。以 MBR 分区为例。每个扇区的容量为 512 字节。其中第一个扇区最重要。它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节。其中分区表每记录一个分区信息就需要 16 字节,这样一来,最多就只有4个分区信息可以写到第一扇区中,这4个分区就是4个主分区。第一个扇区最多只能创建出4个分区 ?为了原创 2021-08-29 19:25:06 · 107 阅读 · 0 评论 -
Linux sem_init函数用法
sem_init函数是Posix信号量操作中的函数。int sem_init(sem_t *sem,int pshared,unsigned int value); sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。如果 pshared 的值为 0,那么信号量将被进程内的线程共享,并且应该放置在这个进程的所有线程都可见的地址上(如全局变量,或者堆上动态分配的变量)。如果原创 2021-08-27 01:12:28 · 3096 阅读 · 0 评论 -
linux库函数mmap()原理及用法详解
目录1.mmap基本概念2.mmap内存映射原理3.mmap和常规文件操作的区别4.mmap优点总结5.mmap相关函数6.mmap使用细节1.mmap基本概念mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函原创 2021-08-25 00:48:09 · 19511 阅读 · 1 评论 -
linux系统编程下的open函数使用方法
open函数属于Linux中系统IO,用于“打开”文件,代码打开一个文件意味着获得了这个文件的访问句柄。int fd = open(参数1,参数2,参数3);int fd = open(const char *pathname,int flags,mode_t mode);1.句柄(file descriptor 简称fd)首先每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2。每打开一个文件就会返回句柄来操作这个文件,一般是从3开始,然后4,5,6一直下去。c原创 2021-08-24 20:02:26 · 3960 阅读 · 0 评论 -
C++中的类对象的内存分布以及虚函数表内存分布
一、前言大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是:可以定义一个基类的指针,其指向一个继承类,当通过基类的指针去调用函数时,可以在运行时决定该调用基类的函数还是继承类的函数。虚函数是实现多态(动态绑定)/接口函数的基础。可以说: 没有虚函数, C++将变得一无是处!二、C++ 类对象的内存布局要想知道C++对象的内存布局, 可以有多种方式, 比如:输出成员变量的偏移, 通过offsetof宏来得到 通过调试器查看, 比如常用的VS2.1 只有数据成员的对象原创 2021-08-23 22:53:06 · 243 阅读 · 0 评论 -
C++类的虚函数表指针、虚函数表和虚函数的关系及在内存中的位置
目录C++类的虚函数表和虚函数在内存中的位置虚函数表和虚函数在内存中的位置说明结论原文https://blog.csdn.net/JMW1407/article/details/108243316C++类的虚函数表和虚函数在内存中的位置虚函数表指针是虚函数表所在位置的地址。虚函数表指针属于对象实例。因而通过new 出来的对象的虚函数表指针位于堆,声名对象的虚函数表指针位于栈。总结:1.虚函数表指针位置取决于对象在哪。如果是new的对象,则存在堆上,如果是直接声明,则存在栈上.原创 2021-08-23 16:47:24 · 620 阅读 · 1 评论 -
详解C与C++的联系与区别
C++与C的联系:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性!C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让原创 2021-08-20 16:27:34 · 8727 阅读 · 0 评论 -
详解平衡二叉树、红黑树、B树、B+树在索引中的应用
目录前言什么是索引举例说明使用索引的好处数据库中使用什么数据结构作为索引各种树的名字平衡二叉树B-Tree适合作为索引比B树更适合作为索引的结构——B+树最后参考文章原文:一步步分析为什么B+树适合作为索引的结构原文链接:https://blog.csdn.net/weixin_30531261/article/details/79312676前言本文是在讲述什么样的数据结构适合作为索引,以及其适合作为索引的原因。而阅读本文需要对B树和B+树结构有稍微原创 2021-08-20 16:05:45 · 821 阅读 · 0 评论 -
C/C++实现循环左移,循环右移
目录循环移位直接可用的函数(循环右移、循环左移)整体代码本文的小技巧实现对一个无符号数的循环左移和循环右移循环移位直接可用的函数(循环右移、循环左移)//val表示需要移位的数 n表示移位位数//字节数乘以8代表一共多少位//向右循环移n位的结果:假设数据一共size位,向左移size-n位,再与原数右移n位进行或操作的结果//val表示需要移位的数 n表示移位位数//字节数乘以8代表一共多少位//向右循环移n位的结果:假设数据一共size位,向左移size-n位,原创 2021-08-20 00:26:58 · 5927 阅读 · 0 评论 -
详解C++移动语义std::move()
目录1. C++move的概念2. C++move的特点3. 左值、右值与左值引用、右值引用3.1 左值和右值的概念3.2 左值引用和右值引用4. std::move详解4.1 std::move简介4.2 std::move详解4.3 std::move实现:4.4 std::move的优点4.5std::move的使用参考:https://blog.csdn.net/s11show_163/article/details/114296006...原创 2021-08-19 11:42:53 · 37682 阅读 · 1 评论 -
详解HTTP与HTTPS
目录一、什么是HTTP?什么是HTTPS?1.1 HTTP概念1.2 HTTPS概念二、HTTP原理与特点2.1 HTTP实现原理2.2HTTP的特点三、HTTPS原理与特点3.1 HTTPS原理3.2 对称加密与非对称加密3.3 HTTPS通信过程1. 客户端发起HTTPS请求2. 服务端的配置3. 传送证书4. 客户端解析证书5. 传送加密信息6. 服务段解密信息7. 传输加密后的信息8. 客户端解密信息3.4 HTTPS特..原创 2021-08-18 13:59:35 · 1102 阅读 · 0 评论 -
详解浏览器解析一个URL的全过程
目录1、浏览器解析url2、DNS域名解析3、浏览器获取端口号4、TCP建立连接5、发送HTTP请求6、服务器处理请求7、返回响应结果8、关闭TCP连接9、浏览器加载解析渲染先概括一下整个过程:首先,浏览器向本地DNS服务器发送请求,如果本地没有缓存该域名的IP地址,就需要通过递归或迭代的方式向根域名服务器、顶级域名服务器、权威域名服务器发起查询请求,直至返回一个IP地址给浏览器。然后根据该IP地址建立TCP连接,客户端发送HTTP请求,服务器返回报文,关闭TC原创 2021-08-18 13:57:59 · 12263 阅读 · 0 评论 -
C++实现最大堆最小堆
目录堆和栈的区别最大堆与最小堆最大堆的操作最大堆的插入操作最大堆的弹出操作最大堆的C++代码实现最小堆概念最小堆的插入操作最小堆的弹出操作最小堆的C++代码实现最大堆最小堆的应用1.priority_queue2. STL 堆操作堆和栈的区别 一、堆栈空间分配区别: 1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈; 2、堆(操作系统): 一般由程序员分配释放, 若程序员不..原创 2021-08-18 00:44:48 · 2007 阅读 · 1 评论 -
从str中选 m 个数的所有排列算法
// 从str中选 m 个数的所有排列算法 void perm(string str,int a,int b,int m){// 字符数达到 m 个进行输出 if(a==m){ for(int i=0;i<m;i++){ cout<<str[i]; } cout<<endl; }// 这一句删除,避免每次递归都多出一步判断// if(a==b){// return;// } for(int k=a;k<=b;k++){ s.原创 2021-08-16 18:29:13 · 139 阅读 · 0 评论 -
C++实现字符全排列
输出N个有序字符的全排列。// N个有序字符的全排列#include<iostream>#include<string>using namespace std;// 求str的全排列算法// 其中str范围区间 [a,b] void perm(string str,int a,int b){ if(a==b){// 输出长度为 b+1 for(int i=0;i<=b;i++){ cout<<str[i]; } cou原创 2021-08-16 18:27:58 · 2002 阅读 · 1 评论 -
C++实现全排列
#include <iostream>#include<vector>#include<string>#include <unordered_map>#include <unordered_set>#include <map>#include <queue>#include <algorithm>//算法头文件#include <numeric>#include <stack.原创 2021-08-16 18:16:13 · 431 阅读 · 0 评论 -
在字符串末尾添加字符使其成为回文串
易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,“asds”就不是回文串。)小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。现在请你编写一个程序,程序要能计算出小易可以得到的最短回文串。#include<bits/stdc++.h>using namespace std;bool judge(int start,int end,string s){原创 2021-08-15 12:07:38 · 2037 阅读 · 0 评论 -
IO多路复用的三种机制Select,Poll,Epoll
目录1. IO多路复用2.操作系统基础概念3.Select4.Poll5.Epoll6.总结1. IO多路复用I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作select、poll 和 epoll 都是 Linux API 提供的 IO 复用方式。相信大家都了解了Unix五种IO模型,不了解的可以 => 查看这原创 2021-08-13 17:41:46 · 283 阅读 · 0 评论