自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(195)
  • 收藏
  • 关注

原创 全网首发!!C++20新特性全在这一张图里了

前面我写了C++11、C++14、C++17新特性系列文章,大家可以移步到这里↓↓↓《C++11新特性,所有知识点都在这了!》《C++14新特性的所有知识点全在这儿啦!》《他来了,他来了,C++17新特性精华都在这了》没错,就差C++20新特性了,今天终于出炉啦。目录语言特性比较运算<=>对于 (a <=> b),如果a > b ,则运算结果>0,如果a < b,则运算结果<0,如果a==b,则运算结果等于0,注意.

2021-04-11 19:25:44 1696

原创 c++11新特性,所有知识点都在这了!

这篇文章基本上涵盖了c++11的所有新特性,并有详细代码介绍其用法,对关键知识点做了深入分析,对重要的知识点我单独写了相关文章并附上了相关链接,我还准备了完整版c++新特性脑图,有需要可以去我的gz号回复 “新特性” 下载,见文章最后。auto & decltype关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decltype关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。 auto:让编译器在编译器就推导出变量的类型,

2020-05-11 20:27:49 1646

原创 std::sort的底层是快速排序吗?可不止如此。

回答重点std::sort 非常高效,它不单纯是快速排序,而是使用了一种名为 introspective sort(内省排序)的算法。内省排序是快速排序、堆排序和插入排序的结合体,它结合这些算法优点的同时避免它们的缺点,特别是快速排序在最坏情况下的性能下降问题。注意:本题介绍,仅限于GCC的源码实现。扩展知识内省排序首先使用快速排序算法。

2025-05-15 10:54:43 335

原创 拷贝构造函数如果不加引用会怎样?

这避免了无限循环问题,因为引用简单地指向现有对象的内存位置,并且在过程中没有创建新对象。通过在拷贝构造函数中使用引用参数,可以防止这种无限循环,因为在传递引用时不会创建新对象。所以编译器直接在源头就规避了这种问题,防止我们多踩坑。可以看到,如果拷贝构造函数不加引用,编译都会失败的,调用拷贝构造函数需要通过值传递对象,导致步骤1。对象时,调用了拷贝构造函数,并且它接受对。通过值传递时会创建一个新对象。创建新对象需要调用拷贝构造函数。

2025-05-15 10:46:42 210

原创 C++高性能内存分配器TCMalloc

TCMalloc,全称Thread-Caching Malloc,是Google开发的一个高性能内存分配器,旨在替代系统的默认内存分配器(如malloc、free、new、delete等)。它通过线程缓存和中央自由列表等机制,实现了高效的内存分配和回收,特别适用于多线程、高并发场景。TCMalloc的核心优势在于其高效性和可扩展性。对于大多数对象来说,分配和释放速度非常快,且没有锁竞争。它支持两种缓存模式:每个线程缓存和每个逻辑CPU缓存,从而在不同线程数量下都能保持高效的性能。

2025-05-09 10:05:11 676

原创 腾讯C++面经

面向连接传输可靠传输形式传输效率所需资源应用场景首部字节TCP面向连接可靠字节流慢多要求通信的数据可靠,比如文件传输,邮件传输20-60UDP无连接不可靠数据报文段快少要求通信速度快8三次握手才可以阻止重复历史连接的初始化(主要原因)三次握手才可以同步双方的初始序列号三次握手才可以避免资源浪费两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

2025-05-09 10:01:13 541

原创 手撕LFU

你大概会去查看借阅记录,看哪些书籍被频繁借阅,频繁被借阅(相当于被访问)的书籍会继续留在专区,而那些很久都没有读者借阅(长时间未被访问 )的书籍,会将其从专区移除,放到普通书架,把空间让给新的热门书籍。也就是说,序列头部的节点是刚刚被访问过的,而尾部的节点则是最久未被访问的,在需要淘汰元素时,就优先淘汰尾部节点。在 LRU 算法里,我们要维护元素的访问顺序,每次访问一个节点,无论是新节点还是已有节点,都要把它移到有序序列的头部,以此表示它是最新被访问的。这样就实现了,将某节点,移动到头部的操作。

2025-05-08 10:48:22 969

原创 高端知识点,ELF结构详解

ELF(可执行和链接格式)是 Linux 系统中用于可执行文件和共享库的文件格式。它定义了如何将一个文件加载到内存中并执行。

2025-05-08 10:10:51 790

原创 std::endl的性能问题分析

因为每次都需要刷新输出缓冲区,所以如果频繁输出,会有一些性能问题。

2025-04-25 16:21:53 363

原创 为什么栈内存比堆内存速度快?

栈内存的申请和释放速度快于堆内存,主要原因包括:栈内存的管理是自动且顺序的,而堆内存的管理是手动且随机的。栈内存的操作不涉及操作系统和线程同步,而堆内存可能涉及系统调用和锁机制。栈内存具有良好的缓存局部性,而堆内存的缓存局部性较差。栈内存不会产生内存碎片问题,而堆内存可能会产生内存碎片。码字不易,欢迎大家关注评论C++训练营专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!

2025-04-25 16:14:46 634

原创 有了万能引用,为什么还需要完美转发?

万能引用的形式是T&&,应用场景:当T是一个模板参数,且需要进行类型推导时(例如函数模板参数)。当使用auto&&声明变量时。此时T&&或auto&&可以绑定到左值、右值,因此被称为万能引用。

2025-04-24 11:08:15 753

原创 详解memcpy的实现原理,可不只是逐个字节复制那么简单

* 函数原型 */memcpy的功能是将src指向的内存区域的前n个字节复制到dest指向的内存区域。使用memcpy,需要注意以下几点:不处理重叠区域(这是memmove的职责)返回目标地址destdest和src都是有效指针内存区域不重叠有足够的空间。

2025-04-24 11:04:52 606

原创 Mutex的实现原理

上述方法展示了如今如何构建真正的锁:一些硬件支持(以更强大的指令形式)加上一些操作系统支持(例如,在Solaris上的park()和unpark()原语,或Linux上的futex)。当然,细节各不相同,执行这种锁定的确切代码通常高度优化。如果你想了解更多细节,可以查看Solaris或Linux代码库;它们是非常有趣的阅读[L09, S09]。还可以查看David等人的优秀工作,比较现代多处理器上不同的锁定策略[D+13]。

2025-04-23 13:21:45 1119

原创 C++17新特性全在这了!!!

本文详细介绍了C++17标准中引入的所有重要特性。C++17 包含以下新的语言特性:类模板的模板参数推导使用 auto 声明非类型模板参数折叠表达式从花括号初始化列表推导 auto 的新规则按值捕获 this内联变量嵌套命名空间结构化绑定带初始化器的选择语句UTF-8 字符字面量枚举的直接列表初始化[fallthrough]、[nodiscard]、[maybe_unused] 属性类模板参数推导C++17 包含以下新的库特性:std::anystd::apply。

2025-04-23 13:19:17 932

原创 100行代码实现无栈协程

先看测试代码:https://godbolt.org/z/zYT6bon36。

2025-04-22 13:32:01 1044

原创 多图详解函数调用的底层原理

当一个函数(callee)被调用时,函数的参数、局部变量和返回地址等信息会被保存在栈内存中,同时函数执行完成后,这些信息会被弹出栈,控制权将返回到(caller)调用该函数的地方。每当一个函数被调用时,一个新的函数栈帧会被创建并被推入函数调用栈的顶部,当函数执行完毕后,对应的函数栈帧会被弹出并释放。我们将看到,在完成整个函数调用后,栈的顶部将恢复到这个位置。当函数foo,即被调用者,获得程序的控制权时,它必须做三件事:设置自己的栈帧,为局部存储分配空间,并根据需要保存EBX、ESI和EDI寄存器的内容。

2025-04-22 13:29:33 746

原创 内存泄露、死锁检测工具来了

项目背景项目背景。

2025-04-21 16:02:16 1025

原创 为什么多态一定需要指针或者引用才可触发?

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!当然,这里的所有切片都可以通过将函数参数改为引用而不是按值传递来轻松避免(这是为什么按引用而不是按值传递类的另一个好理由)。在上面的例子中,我们看到了切片导致错误结果的情况,因为派生类被切掉了。在这种情况下,很明显发生了什么,但如果你的函数实际上没有像这样打印任何标识信息,追踪错误可能会很困难。现在是一个有效的选项,这可能或可能不是你想要的。

2025-04-21 15:57:08 623

原创 一个好用的高性能日志库

对于 C++17 NanoLog 和预处理器 NanoLog,它会使用 NanoLog 库编译客户端应用程序,执行该应用程序,并将生成的日志文件通过解压缩器运行。使用预处理器版本的好处是它在编译时完成更多工作,从而在运行时获得略微优化的性能。要在代码中使用 NanoLog 系统,只需包含 NanoLog 头文件(对于 C++17 NanoLog 使用 NanoLogCpp17.h,对于预处理器 NanoLog 使用 NanoLog.h),并以类似于 printf 的方式调用。所使用的日志消息可在下方的。

2025-04-18 16:02:03 1156

原创 推荐一个C++基础库——POCO库

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!推荐使用Shining Light Productions的预编译包,或通过。提供Visual Studio工程文件和GNU Make支持,详见官方文档。尽管存在部分功能重叠,POCO更应被视为Boost的。今天介绍个非常非常强大的C++基础库POCO。实际项目中二者经常同时使用。

2025-04-18 15:58:02 286

原创 C语言基础系列【36】多线程编程

多线程编程是一种在程序中同时执行多个线程(子任务)的技术。线程是程序中的一个执行单元,每个线程都有自己的执行路径和上下文。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的内存空间和资源,但拥有各自的栈空间和寄存器状态。

2025-04-16 11:03:44 779

原创 百度一面面经(C++)

回答多态的实现原理,主要可以围绕在虚函数虚函数表和虚函数表指针方向上。多态通过虚函数实现。通过虚函数,子类可以重写父类的方法,当通过基类指针或引用调用时,会根据对象的实际类型调用对应的函数实现。而这更深层次的原理,是通过虚表(vtable)和虚表指针(vptr)机制实现的。虚表是一个函数指针数组,包含了该类所有虚函数的地址,而虚表指针存储在对象实例中,指向属于该对象的虚表。可以从以下几个方面,更全面的了解多态:1)虚函数和重写:**在基类中使用关键字virtual。

2025-04-16 10:54:31 1121

原创 C++基础系列【36】异常处理

虽然C++标准库提供了丰富的异常类,但在某些情况下,开发者可能需要定义自己的异常类。我们可以通过继承基类并重载what方法来实现。示例public:private:");try {// 抛出自定义异常return 0;类继承自并重载了what方法。函数抛出了一个异常,该异常在main函数的catch块中被捕获并处理。注意,这里还添加了一个捕获所有其他子类的catch块,确保能够捕获所有未知异常。noexcept从C++11开始,推荐使用noexcept。

2025-04-14 13:26:27 600

原创 C语言基础系列【35】错误处理

在复杂的大型项目中,统一的错误处理机制很有必要,通过自定义错误处理函数和自定义错误码,我们可以集中管理错误处理逻辑,避免重复代码。// 自定义错误码012// 自定义错误处理函数break;break;// 终止程序// 其他操作...// 注意:这里应该添加对file是否为NULL的检查,以避免在file为NULL时调用fclose导致崩溃函数接收一个错误码和一个错误消息字符串,并根据错误码打印相应的错误信息。然后,它使用exit。

2025-04-14 13:21:18 1024

原创 50个CPP入门&进阶项目

博主介绍:程序喵大人上这个网站看看呢(Top 50 C++ Project Ideas For Beginners and Advanced [Updated 2025] - GeeksforGeeks),这里总结了50个CPP入门&进阶项目,给你截几个图:英文看起来不方便的话,可以阅读下面的工具翻译版本:CGPA计算器是一个C++程序,用于计算学生的累积平均绩点(CGPA)。用户输入课程数量和每门课程的成绩,程序会显示学生的总课程成绩、总学分、总绩点、学期平均绩点(GPA),并最终生成学生的CGPA。所需

2025-04-11 13:42:22 1571

原创 C++20 的 std::format 比 sprintf 好在哪?

整体语法类似于python的format,我只需要传递一个{},不需要提前确认它具体的参数是什么类型的,确认错误还会导致运行时crash,有了format,我完全不需要担心这种问题。专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!这种错误在编译时不会被检测到,可能会导致运行时崩溃。format支持为自定义class配置。

2025-04-11 13:30:27 263

原创 如何为C++实习做准备?

注意,这里是看不是背,我们通过面经里的问题来进行归纳整理,对面经的问题进行分类,然后自己通过翻阅书籍和文章来找到答案进行整理,记住哈,记得分类,后面便于补充,也有利于搭建我们的知识体系。无论是校招还是社招,找工作最好都要有个过硬的项目才行。现在校招满大街千篇一律全是。现在的面试,特别是大厂的面试,一定会考察一到两个算法题,算法题的训练可以去。

2025-04-11 13:23:50 228

原创 std::string核心知识点SSO

在谈论std::string实现时,是个非常重要的知识点。SSO全称,也就是说,在少量字符下,优化为使用栈空间,而在大量字符下,才申请使用堆空间。

2025-04-10 14:14:57 533

原创 手把手教你如何设计内存池

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!

2025-04-10 14:09:51 282

原创 C++编程新手怎么学习?推荐这10个代码库,20个免费网站+学习资料

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!

2025-04-09 11:22:18 1341

原创 收藏!C++性能优化工具大全脑图:从静态分析到动态检测 | 性能优化

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!

2025-04-09 10:37:23 246

原创 C++基础系列【35】巧用assert

assert字面意思是断言,用于判断是否满足某个条件,如果不满足某个条件,则程序会直接崩溃,控制台上会显示崩溃所在的文件名和行号。示例中我用assert来表示函数func的输入一定要>0。我如果输入了-1,程序运行时会在assert处crashAborted我们一定在assert处只做判断,不要添加任何功能逻辑,因为assert只在debug模式下有作用release模式下,assert这行代码会自动跳过去,会自动被忽略。这种改变了i状态的assert。

2025-04-03 16:19:53 414

原创 C语言系列【34】标准库函数

本文主要介绍C语言中一些常见的各个方向的标准库函数。

2025-04-02 13:52:47 924

原创 C++基础系列【34】智能指针

在学习智能指针之前,我们需要了解RAII的概念。

2025-04-02 13:48:36 816

原创 C语言基础系列【33】命令行参数

命令行参数将从命令行中获取输入的信息,方便用户在程序运行时动态的传递信息给程序,提高灵活性。在C语言中,命令行参数通过main函数的参数传递给程序。

2025-04-01 15:29:49 905

原创 C++基础系列【33】使用nullptr而非NULL

因为需要为空指针常量起一个名字,更清晰的表明它表达的是什么含义,就像3.1415926为什么要用π表示一样,尽管宏一直是被各方吐槽的,但为了有名字在当时C++也只能这样,这也是。专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!之父一直推崇尽量避免使用它,在实际编程中,可以减少宏的使用,直接使用0。,没有任何其它语义,空指针的活就安排给其它员工,这个员工就是。其实就是一个宏,对于宏,

2025-04-01 15:25:05 945

原创 C++基础系列【32】左值、右值详解

万能引用的形式是T&&当T是一个模板参数,且需要进行类型推导时(例如函数模板参数)。当使用auto&&声明变量时。此时T&&或auto&&可以绑定到左值、右值,因此被称为万能引用。

2025-03-31 14:32:29 1018

原创 C语言基础系列【32】指针进阶5:指针与常量

常量指针(Pointer to Constant):可以改变指向,但不能通过该指针修改值。指针常量(Constant Pointer):不能改变指向,但可以通过该指针修改值。常量指针常量(Constant Pointer to Constant):既不能改变指向,也不能通过该指针修改值。英文比中文更容易理解。码字不易,欢迎大家关注评论C++训练营。

2025-03-31 10:58:11 320

原创 C语言基础系列【31】指针进阶4:指针与高级数据类型

在C语言中,除了基本的整型、浮点型、字符型等数据类型外,还有一些高级数据类型。

2025-03-28 15:13:38 597

原创 C++基础系列【31】类型转换

对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很容易出bug,需要严格审查代码才能消除这种隐患,可C这种转换方式不利于我们审查代码,且程序运行时也可能会出bug。专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向。),万不得已不要使用,因为不安全,有bug风险。

2025-03-28 15:08:39 283

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除