08 2023 档案
摘要:# 1.操作系统(基本分页存储管理的基本概念)  - ***连续分配*** :为用户进程分配的必须是一个 **连续
阅读全文
摘要:17.LINUX中的read函数 1.read函数的函数原型 #include <unistd.h> ssize_t read(int fd,void *buf,size_t count); 函数原型为:ssize_t read(int fd, void *buf, size_t count);其中
阅读全文
摘要:16.Linux中write函数详解 头文件: #include <unistd.h> 函数原型: write(int fd, const void *buf, size_t count); 函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。 返回值:如果顺
阅读全文
摘要:# 12.Acwing基础课第799题-简单-最长连续不重复子序列 ## 题目描述 给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 ## 输入格式 第一行包含整数 n。 第二行包含 n个整数(均在 0∼1050∼105 范围内),表示整数序列。 ## 输出格式 共
阅读全文
摘要:# 11.Acwing基础课第795题-简单-前缀和 ## 题目描述 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 , A,B,请你计算 A/B 的商和余数。 ## 输入格式 共两行,第一行包含整数 A,第二行包含整数 B。 ## 输出格式 共两行,第一行输出所求的商,第二行输出所求余数。 ## 数据范围 1≤A
阅读全文
摘要:# 6.Acwing基础课第793题-简单-高精度乘法 ## 题目描述 给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。 ### **输入格式** 共两行,第一行包含整数 A,第二行包含整数 B。 ### **输出格式** 共一行,包含 A×B 的值。 ### **数据范围**
阅读全文
摘要:# 5.Acwing基础课第792题-简单-高精度减法 ## 题目描述 给定两个正整数(不含前导0),计算它们的差,计算结果可能为负数。 ### **输入格式** 共两行,每行包含一个整数。 ### **输出格式** 共一行,包含所求的差。 ### **数据范围** 1≤整数长度≤100000 ##
阅读全文
摘要:# 4.Acwing基础课第791题-简单-高精度加法 ## 题目描述 给定两个正整数(不含前导 0),计算它们的和。 ## **输入格式** 共两行,每行包含一个整数。 ## **输出格式** 共一行,包含所求的和。 ## **数据范围** 1≤整数长度≤100000 ## **输入样例** ``
阅读全文
摘要:# 3.Acwing基础课第789题-简单-数的范围 ## 题目描述 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。 对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。 如果数组中不存在该元素,则返回 -1 -1。 ## 输入格式 第一行包含整数 n 和
阅读全文
摘要:# 2.Acwing基础课第786题-简单-第k个数 ## 题目描述 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。 ## 输入格式 第一行包含整数 n 和 k。 第二行包含 n 个整数(所有整数均在1~范围内),表示整个数列。 ## 输出格
阅读全文
摘要:# 1.Acwing基础课第785题-简单-快速排序 ## 题目描述 给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 ## 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~范围内),表示整个数列。
阅读全文
摘要:# 15.LINUX命令kill ## 1.kill命令简介 在Linux统中,kill命令用于向运行中的进程发送信号,默认发送的信号是终止信号,会请求进程退出。kill(杀)可能会引起误解,实际上发送的信号可能与杀死进程无关。 **我们最常使用到的kill命令为:** ```shell kill
阅读全文
摘要:# 14.linux命令ps ## 1.ps aux 对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令。 使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪
阅读全文
摘要:13.进程间通信 1.学习目标 熟练使用pipe进行父子进程间通信 熟练使用pipe进行兄弟进程间通信 熟练使用fifo进行无血缘关系的进程间通信 使用mmap进行有血缘关系的进程间通信 使用mmap进行无血缘关系的进程间通信 2.进程间通信相关概念 2.1 什么是进程间通信 Linux环境下,进程
阅读全文
摘要:12.进程控制 1.学习目标 了解进程相关的概念 掌握fork/getpid/getppid函数的使用 熟练掌握ps/kill命令的使用 熟练掌握execl/execlp函数的使用 说出什么是孤儿进程什么是僵尸进程 熟练掌握wait函数的使用 熟练掌握waitpid函数的使用 2.进程相关概念 2.
阅读全文
摘要:11.文件和目录 1.文件操作相关函数 1.1stat/lstat函数 █函数描述: 获取文件属性 █函数原型: int stat(const char *pathname, struct stat *buf);//加了const一定是输入参数,buf是输出参数 int lstat(const ch
阅读全文
摘要:10.文件IO 从本章开始学习各种Linux系统函数,这些函数的用法必须结合Linux内核的工作原理来理解,因为系统函数正是内核提供给应用程序的接口,而要理解内核的工作原理,必须熟练掌握C语言,因为内核也是用C语言写的,我们在描述内核工作原理时必然要用“指针”、“结构体”、“链表”这些名词来组织语言
阅读全文
摘要:9.gdb调试 1.gdb介绍 GDB(GNU Debugger)是GCC的调试工具。其功能强大,现描述如下: GDB主要帮忙你完成下面四个方面的功能: ▶ 启动程序,可以按照你的自定义的要求随心所欲地运行程序。 ▶ 可让被调试的程序在你所指定的断点处停住。(断点可以是条件表达式) ▶ 当程序被停住
阅读全文
摘要:8.makefile 学习目标: 熟练使用规则编写简单的makefile文件 熟练使用makefile中的变量 熟练使用makefile中的函数 1.makefile makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能
阅读全文
摘要:7.静态库和共享(动态)库 7.1库的介绍 什么是库 库是二进制文件,是源代码文件的另一种表现形式,是加了密的源代码; 是一些功能相近或者是相似的函数的集合体。 使用库有什么好处 ▶ 提高代码的可重用性,而且还可以提高程序的健壮性; ▶ 可以减少开发者的代码开发量,缩短开发周期。 库制作完成后,如何
阅读全文
摘要:## 6.1 gcc的工作流程 gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:  四个步骤并不是
阅读全文
摘要:# 1.vim简单介绍 vi是”visual interface”的简称,它在Linux上的地位就仿佛Windows中的记事本一样。它可以执行编辑、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。vi是一个文本编辑程序,没有菜单,只有命令。 vim更高级一些,可以理解
阅读全文
摘要:# [25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/) 给你链表的头节点 `head` ,每 `k` 个节点一组进行翻转,请你返回修改后的链表。 `k` 是一个正整数,它的值小于或等于链表的长度。如果节点总数
阅读全文
摘要:# [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/) ==给你单链表的头节点 `head` ,请你反转链表,并返回反转后的链表。== **示例 1:**  ==给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。== =
阅读全文
摘要:# [283. 移动零](https://leetcode.cn/problems/move-zeroes/) ==给定一个数组 `nums`,编写一个函数将所有 `0` 移动到数组的末尾,同时保持非零元素的相对顺序。== **请注意** ,必须在不复制数组的情况下原地对数组进行操作。 **示例 1
阅读全文
摘要:# [26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/) 创建数组 声明数组的语法:数据类型 数组名[数组长度]; 注意:数组长度必须是整数,可以是常量,也可以是**变量和表达式**。
阅读全文
摘要:# 125.C++中的size_t ## 1.size_t ●size_t是一些C/C++标准在stddef.h中定义的,size_t类型表示C中任何对象所能达到的最大长度,它是无符号整数 ●它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。size_t在32位系统上定义
阅读全文
摘要:# 1.【linux】 下根目录,家目录区别  **家目录是在根目录里面。** ## 1.家目录 一般普通用户,家
阅读全文
摘要:# 2.为什么析构函数一般写成虚函数 在C++实现多态里,有一个关于 析构函数的重写问题:基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相同,看起来违背了重写的规则,但实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destruc
阅读全文
摘要:# 1.C++的多态如何实现 ## 1.多态基本概念 多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。 多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how”分离开来。多态性**改善了代码的可读性和组织性**,同时也使创建的程序具有**可
阅读全文
摘要:# 38.hashtable中解决冲突有哪些方法? 哈希表是一种使用哈希函数来计算数据存储位置的数据结构。在哈希表中,可能会遇到两个或多个不同的键被哈希到同一个存储位置的情况,这被称为哈希冲突或碰撞。处理哈希冲突的主要方法有以下几种: 1.**链地址法(Separate Chaining)**:在这
阅读全文
摘要:# 37.STL中unordered_map和map的区别和应用场景 ## 1.STL中unordered_map和map的区别 `std::unordered_map` 和 `std::map` 都是 C++ 标准库中用于存储键值对的关联容器,它们主要的区别在于内部数据的组织方式,以及因此产生的一
阅读全文
摘要:# 36.set和map的区别,multimap和multiset的区别 ## 1.set和map的区别 `std::set`和`std::map`是C++标准库中的两个关联容器,它们都是基于红黑树实现的,但在用途和特性上有一些区别: 1.**元素类型**: - `std::set`:是一个集合容器
阅读全文
摘要:# 34.STL中set的实现? STL中的容器可分为序列式容器(sequence)和关联式容器(associative),set属于关联式容器。 set的特性是,所有元素都会根据元素的值自动被排序(默认升序),set元素的键值就是实值,实值就是键值,set不允许有两个相同的键值 set不允许迭代器
阅读全文
摘要:# 33.STL中的priority_queue的实现 ## 1.priority_queue的介绍 1.优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 2.此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素 (优先队列中位于顶部的元素)。
阅读全文
摘要:# 32.STL中的heap的实现 版本1: ## 1.堆的原理 堆(Heap)是一种数据结构,通常用于实现优先队列。堆是一种树形结构,通常由一个完全二叉树构成,因此它只有两个指针,即左子节点和右子节点。堆有两种类型:最大堆(Max Heap)和最小堆(Min Heap)。在最大堆中,父节点的值大于
阅读全文
摘要:# 31.STL中stack和queue的实现 ## 1.STL中stack ### 1.栈的概念 栈(Stack)是一种数据结构,它遵循后进先出(Last-In-First-Out,LIFO)的原则,也就是说,最后进入栈的元素最先被取出。栈是一种线性数据结构,它由多个元素组成,每个元素被称为栈项(
阅读全文
摘要:# 30.STL中的deque的实现 ## 1.deque简介 双端队列deque,与vector的最大差异在于: 1.deque运行常数时间对头端或尾端进行元素的插入和删除操作 2.deque没有所谓的容器概念,因为它是动态地以分段连续空间组合而成随时可以增加一块新的内存空间并拼接起来 虽然deq
阅读全文
摘要:# 29.STL中list的实现 ## 1.顺序表 ### 1.顺序表的定义 - 顺序表是用一段**物理地址连续的存储单元**依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 - 顺序表:**可动态增长的数组,要求数据是连续存储的** ```C++ typedef s
阅读全文
摘要:# 28.STL中slist的实现 ## 1.链表结构 ```C++ typedef struct _LinkNode { int data; //结点的数据域 struct _LinkNode* next; //结点的指针域 }LinkNode, LinkList; //LinkList 为指向结
阅读全文
摘要:# 27.STL中vector的实现 作者建议还是稍微看一下底层机制,vector主要有三个指针(迭代器) 来表示的: ●\_Myfirst 和 \_Mylast 可以用来表示 vector 容器中目前已被使用的内存空间; ●\_Mylast 和 \_Myend 可以用来表示 vector 容器目前
阅读全文
摘要:# 26.STL中迭代器失效的情况有哪些? ## 1.STL之vector迭代器失效 `std::vector`是一个动态数组,当其大小或容量发生改变时,其内存可能被重新分配,从而导致已经存在的迭代器失效。以下是几种可能导致迭代器失效的情况: 1.**插入或添加元素**:使用`push_back`或
阅读全文
摘要:# 25.说一下STL每种容器对应的迭代器 | **容器** | **迭代器** | | | | | vector、deque | 随机访问迭代器 | | stack、queue、priority_queue | 无 | | list、(multi)set/map | 双向迭代器 | | unord
阅读全文
摘要:# 24.vector的增加删除都是怎么做的?为什么是1.5或者是2倍? size()函数返回的是已用空间大小,capacity()返回的是总空间大小,capacity()-size()则是剩余的可用空间大小。当size()和capacity()相等,说明vector目前的空间已被用完,如果再添加新
阅读全文
摘要:# 23.常见容器性质总结? C++ STL(Standard Template Library)提供了多种容器,用于存储和操作各种类型的数据。以下是一些常见容器的特性总结: 1.**std::vector**:动态数组,能高效地在末尾进行插入和删除操作,能直接访问任何元素。但在中间位置进行插入或删
阅读全文
摘要:# 22.STL中hash table扩容发生什么? 在 C++ STL 中,`std::unordered_map` 和 `std::unordered_set` 是两个使用哈希表 (hash table) 作为其底层实现的容器。 当哈希表的元素数量增长到某个阈值时,就需要进行扩容。这个阈值通常是
阅读全文
摘要:# 21.STL中的allocator、deallocator
阅读全文
摘要:# 20.STL中list与queue之间的区别 `std::list` 和 `std::queue` 是 C++ 标准库中的两个不同容器,它们之间有以下几点区别: 1. 容器类型:`std::list` 是一个双向链表,而 `std::queue` 是一个队列,可以使用多种实现方式(如顺序容器、优
阅读全文
摘要:# 19.map中[]与find的区别? 1. map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。 2. map的find函数:用关键码执行查找,找到了返回该位置的迭代器;如果不存在这个关键码,就
阅读全文
摘要:# 18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间? ## 1.vector越界访问下标 `std::vector`是C++标准库中的一种动态数组,其大小可以根据需要进行调整。当你试图访问一个不存在的元素,即访问超出其当前大小范围的索引时,将会发生越界访问。
阅读全文
摘要:# 17.STL中unordered_map(hash_map)和map的区别,hash_map如何解决冲突以及扩容 ## 1.区别 ### 1.1需要引入的头文件不同 map: `#include ` unordered_map: `#include ` ### 1.2内部实现机理不同 map:
阅读全文
摘要:# 16.map插入方式有哪几种? 1.用insert函数插入pair数据 ```C++ mapStudent.insert(pair(1, "student_one")); ``` 2.用insert函数插入value_type数据 ```C++ mapStudent.insert(map::va
阅读全文
摘要:# 15.如何在共享内存上使用STL标准库? 1.想像一下把STL容器,例如map, vector, list等等,放入共享内存中,IPC一旦有了这些强大的通用数据结构做辅助,无疑进程间通信的能力一下子强大了很多。 我们没必要再为共享内存设计其他额外的数据结构,另外,STL的高度可扩展性将为IPC所
阅读全文
摘要:# 14.map、set是怎么实现的,红黑树是怎么能够同时实现这两种容器? 为什么使用红黑树? 1.他们的底层都是以红黑树的结构实现,因此插入删除等操作都在O(lgn)时间内完成,因此可以完成高效的插入删除; 2.在这里我们定义了一个模版参数,如果它是key那么它就是set,如果它是map,那么它就
阅读全文
摘要:# 13.STL迭代器如何实现 1.迭代器是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器,除此之外,STL中迭代器一个最重要的作用就是作为容器与STL算法的粘合剂。 2.迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器内部必须保存一个与容器相关联的指针,然后重
阅读全文
摘要:# 12.容器内部删除一个元素 ## 1.关联容器的删除 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除
阅读全文
摘要:# 11.Vector如何释放空间? 由于vector的内存占用空间只增不减,比如你首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是内存占用仍为10000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以
阅读全文
摘要:# 10.STL 中vector删除其中的元素,迭代器如何变化?为什么是两倍扩容?释放空间? size()函数返回的是已用空间大小,capacity()返回的是总空间大小,capacity()-size()则是剩余的可用空间大小。当size()和capacity()相等,说明vector目前的空间已
阅读全文
摘要:# 9.vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素 1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的
阅读全文
摘要:# 8.STL的两级空间配置器 ## 为什么有适配器? (1)小块内存带来的内存碎片问题 单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。 (2)小块内存频繁申
阅读全文
摘要:# 7.简单说一下traits技法 traits技法利用“内嵌型别“的编程技巧与**编译器的template参数推导功能**,增强C++未能提供的关于型别认证方面的能力。常用的有iterator_traits和type_traits。 **iterator_traits** 被称为**特性萃取机**
阅读全文
摘要:6.STL中hashtable的实现? STL中的hashtable使用的是开链法解决hash冲突问题,如下图所示。 hashtable中的bucket所维护的list既不是list也不是slist,而是其自己定义的由hashtable_node数据结构组成的linked-list,而bucket聚
阅读全文
摘要:# 5.说一下C++左值引用和右值引用 C++11正是通过引入右值引用来优化性能,具体来说是通过移动语义来避免无谓拷贝的问题,通过move语义来将临时生成的左值中的资源无代价的转移到另外一个对象中去,通过完美转发来解决不能按照参数实际类型来转发的问题(同时,完美转发获得的一个好处是可以实现移动语义)
阅读全文
摘要:# 4.迭代器:++it、it++哪个好,为什么 1.前置返回一个引用,后置返回一个对象 ```C++ // ++i实现代码为: int& operator++() { *this += 1; return *this; } ``` 2.前置不会产生临时对象,后置必须产生临时对象,临时对象会导致效率
阅读全文
摘要:# 3.使用智能指针管理内存资源,RAII是怎么回事? 什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的
阅读全文
摘要:# 2.解释一下什么是trivial destructor 什么是 trivial destructor和 non-trivial destructor 如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如
阅读全文
摘要:# 1.什么是STL? C++STL从广义来讲包括了三类:算法,容器和迭代器。 - 算法包括排序,复制等常用算法,以及不同容器特定的算法。 - 容器就是数据的存放形式,包括顺序容器和关联式容器,顺序式容器就是list,vector等,关联式容器就是set,map等。 - 在C++中,迭代器是一种用于
阅读全文
摘要:# 10.智能指针出现循环引用怎么解决? 弱指针用于专门解决shared_ptr循环引用的问题,weak_ptr不会修改引用计数,即其存在与否并不影响对象的引用计数器。循环引用就是:两个对象互相使用一个shared_ptr成员变量指向对方。弱引用并不对对象的内存进行管理,在功能上类似于普通指针,然而
阅读全文
摘要:# 9.手写实现智能指针类需要实现哪些函数? ==1.智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer对象的引用计数,一旦T类型对象的引用计数为0,就释放该对象。== 除了指针对象外,我们还需要一个引用计数的指针设定对象的值,并将
阅读全文
摘要:# 8.智能指针的循环引用 循环引用是指使用多个智能指针share_ptr时,出现了指针之间相互指向,从而形成环的情况,有点类似于死锁的情况,这种情况下,智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏。举个例子: ```C++ #include using namespace std; t
阅读全文
摘要:# 7.说说你了解的auto_ptr作用 1.auto_ptr的出现,主要是为了解决“有异常抛出时发生内存泄漏”的问题;抛出异常,将导致指针p所指向的空间得不到释放而导致内存泄漏; 2.auto_ptr构造时取得某个对象的控制权,在析构时释放该对象。我们实际上是创建一个auto_ptr\类型的局部对
阅读全文
摘要:# 6.智能指针的作用 1.C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。 2.智能指针在C++11版本之后提供,包含在头文件\中,shared_ptr、unique_ptr、
阅读全文
摘要:# 5.说一说你了解的关于lambda函数的全部知识 1.利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象; 2.每当你定义一个lambda表达式后,编译器会自动生成一个匿名类(这个类当然重载了()运算符),我们称为闭包类型(closure type)。那么在运行时,这个l
阅读全文
摘要:# 4.智能指针的原理、常用的智能指针及实现 ## 1.auto_ptr 当你在读这篇文章的时候,应该都有这样一个疑问?那就是为什么要使用[智能指针](https://so.csdn.net/so/search?q=智能指针&spm=1001.2101.3001.7020)。 我们先看这样一个示例:
阅读全文
摘要:# 3.C++中NULL和nullptr区别 ## 1.NULL是什么 在[《NULL,0,'\0',"0","\0"的区别》](http://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649284887&idx=1&sn=e97526b0e2cb
阅读全文
摘要:# 2.auto、decltype和decltype(auto)的用法 ## 1.auto 编程时常常需要把表达式的值赋给变量,这就要求声明变量时清楚的知道表达式的类型。然而有些情况是声明的变量的类型我们并不知道,比如在模板编程时。为了解决这个问题,C++11引入了auto类型说明符,用它来让编译器
阅读全文
摘要:# 1.C++ 11有哪些新特性? - long long类型 - 列表初始化 - nullptr常量(替代 NULL) - constexpr变量[[68.C++中的const - CodeMagicianT - 博客园 (cnblogs.com)](https://www.cnblogs.com
阅读全文
摘要:# 15.类对象的大小受哪些因素影响? 1.类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小; 2.内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的; 3.虚函数的话,会在类对象插入vptr指针,加上指针大小; 4.当该类是某类的派生类,那么派生类继承的基
阅读全文
摘要:# 14.this指针调用成员变量时,堆栈会发生什么变化? 当在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象的地址传给作为隐含参数传递给函数,这个隐含参数就是this指针。 即使你并没有写this指针,编译器在链接时也会加上this的,对各成员的访问都是通过this的。 例如你建立了类
阅读全文
摘要:# 13.请说一下以下几种情况下,下面几个类的大小各是多少? ```C++ class A {}; int main() { cout << sizeof(A) << endl;// 输出 1; A a; cout << sizeof(a) << endl;// 输出 1; return 0; }
阅读全文
摘要:# 12.你知道空类的大小是多少吗? 1.C++空类的大小不为0,不同编译器设置不一样,vs设置为1 2.C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址 3.带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定
阅读全文
摘要:# 11.如果在类的析构函数中调用delete this,会发生什么? 会导致堆栈溢出。原因很简单,delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”。显然,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢
阅读全文
摘要:# 10.为什么是不可预期的问题? delete this之后不是释放了类对象的内存空间了么,那么这段内存应该已经还给系统,不再属于这个进程。照这个逻辑来看,应该发生指针错误,无访问权限之类的令系统崩溃的问题才对啊?这个问题牵涉到操作系统的内存管理策略。delete this释放了类对象的内存空间,
阅读全文
摘要:# 9.在成员函数中调用delete this会出现什么问题?对象还可以使用吗? 在类对象的内存空间中,只有数据成员和虚函数表指针,并不包含代码内容,类的成员函数单独放在代码段中。在调用成员函数时,隐含传递一个this指针,让成员函数知道当前是哪个对象在调用它。当调用delete this时,类对象
阅读全文
摘要:# 8.内存泄漏的后果?如何监测?解决方法? ## 1.内存泄漏 ### 1.1定义 内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制; ### 1.2种类 #### 1.2.1C/C
阅读全文
摘要:# 7.几个this指针的易混问题 见[6.类的*this指针有以下特点](https://www.cnblogs.com/codemagiciant/p/17601868.html)
阅读全文
摘要:## 6.类的\*this指针有以下特点 #### 1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的 #### 2.this只能在成员函数中使用。全局函数、静态函数都不能使用this。 实际上,成员函数默认第一个参数为T \*const this。 如: ``` class A
阅读全文
摘要:# 5.C++中类的数据成员和成员函数内存分布情况 - 非静态成员的数据类型大小之和。 - 编译器加入的额外成员变量(如指向虚函数表的指针)。 - 为了边缘对齐优化加入的padding。 空类(无非静态数据成员)的对象的size为1, 当作为基类时, size为0。 C++类是由结构体发展得来的,所
阅读全文
摘要:# 4.可以说一下你了解的C++得内存管理吗? ## 1.一个由c/C++编译的程序占用的[内存](https://so.csdn.net/so/search?q=内存&spm=1001.2101.3001.7020)分为以下几个部分: C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区
阅读全文
摘要:# 3.什么是内存池,如何实现 内存池(Memory Pool) 是一种**内存分配**方式。通常我们习惯直接使用new、malloc 等申请内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相
阅读全文
摘要:# 2.简要说明C++的内存分区 ## 1.一个由C/C++编译的程序占用的[内存](https://so.csdn.net/so/search?q=内存&spm=1001.2101.3001.7020)分为以下几个部分: C++中的内存分区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区和
阅读全文
摘要:# 1.类的对象存储空间? - 非静态成员的数据类型大小之和。 - 编译器加入的额外成员变量(如指向虚函数表的指针)。 - 为了边缘对齐优化加入的padding。 空类(无非静态数据成员)的对象的size为1, 当作为基类时, size为0。 C++类是由结构体发展得来的,所以他们的成员变量(C语言
阅读全文
摘要:# 134.为什么C++没有垃圾回收机制?这点跟Java不太一样 1. 性能:垃圾回收机制需要额外的内存和计算资源,这会引入一定的开销。C++的设计目标之一是提供高效的性能,垃圾回收机制可能会对程序的性能产生负面影响。因此,C++没有内置的垃圾回收机制,以便程序员自行管理内存等资源。 2. 控制:C
阅读全文
摘要:# 133.为什么不能把所有的函数写成内联函数? 内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。所以一方面如果内联函数体内代码执行时间相比函数调用开销较大,则没有太大的意义;另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数: - 函数体内的
阅读全文
摘要:# 132.delete和delete[]区别? - delete只会调用一次析构函数。 - delete[]会调用数组中每个元素的析构函数。
阅读全文
摘要:# 131.介绍一下几种典型的锁 **读写锁** - 多个读者可以同时进行读 - 写者必须互斥(只允许一个写者写,也不能读者写者同时进行) - 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) **互斥锁** 一次只能一个线程拥有互斥锁,其他线程只有等待 互斥锁是在抢锁失败的情况
阅读全文
摘要:# 130.hello.c 程序的编译过程 以下是一个 hello.c 程序: ```C++ #include int main() { printf("hello, world\n"); return 0; } ``` 在 Unix 系统上,由编译器把源文件转换为目标文件。 ``` gcc -o
阅读全文
摘要:# 129.动态编译与静态编译 ## 1.静态编译 静态编译是将程序代码和库函数一起编译成一个可执行文件的过程。在静态编译过程中,程序代码和库函数的代码被组合在一起,形成一个独立的可执行文件,该文件可以在任何系统上运行,因为它包含了所有所需的代码和库函数。 ### 1.1优点: 1.程序在运行时不需
阅读全文
摘要:# 128.用C语言实现C++的继承 ```C++ #include using namespace std; //C++中的继承与多态 struct A { virtual void fun() //C++中的多态:通过虚函数实现 { cout fun(); //调用父类的同名函数 p1 = &b
阅读全文
摘要:# 127.友元函数和友元类的基本情况 友元提供了不同类的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。通过友元,一个不同函数或者另一个类中的成员函数可以访问类中的私有成员和保护成员。友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
阅读全文
摘要:# 126.友元函数在类内部声明还是内外? 友元函数不一定要在类内声明,普通的友元函数可以在类外声明,也可以在类内声明。 只有友元工厂才必须用到类内声明友元函数。 友元函数可以在类的内部声明,也可以在类的外部声明。 1.如果友元函数是在类的内部声明的,那么它可以直接访问类的私有成员和保护成员,即使这
阅读全文
摘要:# 125.C++从代码到可执行程序经历了什么? ## 1.预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下: 1. 删除所有的#define,展开所有的宏定义。 2. 处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
阅读全文
摘要:# 124.什么是一致性哈希? **一致性哈希** 一致性哈希是一种哈希算法,就是**在移除或者增加一个结点时,能够尽可能小的改变已存在key的映射关系** 尽可能少的改变已有的映射关系,一般是沿着顺时针进行操作,回答之前可以先想想,真实情况如何处理 一致性哈希将整个哈希值空间组**织成一个虚拟的圆
阅读全文
摘要:# 123.你知道回调函数吗?它的作用? 1.当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数; 2.回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数
阅读全文
摘要:# 122.成员函数里memset(this,0,sizeof(*this))会发生什么 有时候类里面定义了很多int,char,struct等c语言里的那些类型的变量, 可以在构造函数中将它们初始化为0,但是一句句的写太麻烦,所以直接就memset(this, 0, sizeof (*this))
阅读全文
摘要:# 121.static_cast比C语言中的转换强在哪里? 1. 更加类型安全:`static_cast`在执行类型转换之前会进行类型检查,如果转换不可行,编译时会产生错误或警告。这有助于及早发现潜在的错误并进行修复,而不是在运行时出现未定义的行为。 2. 适用于指针和引用:`static_cas
阅读全文
摘要:# 120.strcpy函数和strncpy函数的区别?哪个函数更安全? 1.函数原型 ```C++ char* strcpy(char* strDest, const char* strSrc) char *strncpy(char *dest, const char *src, size_t n
阅读全文