![](https://i-blog.csdnimg.cn/direct/2c7cd7f9ea6a4ceab551694da9c03ff8.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 80
c++从入门1.0到掌握2.0!
**K
不拘泥于任何特定的技术,而应该拥有足够广泛的背景和经验基础,以便在特定的情况下选择合适的解决方案。背景来自对计算机科学基本原理的理解,经验来自广泛的实际项目。理论结合实践才会让你变得强大。
展开
-
C++ 哈希
给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。sttrue由于题目中已经确定都是由小写字母组成的字符串,因此用一个大小为26的数组来表示哈希。原创 2024-07-22 15:35:15 · 1049 阅读 · 0 评论 -
C++ 协程
有栈(stackful)协程通常的实现手段是在堆上提前分配一块较大的内存空间(比如 64K),也就是协程所谓的“栈”,参数、return address 等都可以存放在这个“栈”空间上。如果需要协程切换,那么通过 swapcontext 一类的形式来让系统认为这个堆上空间就是普通的栈,这就实现了上下文的切换。有栈协程最大的优势就是侵入性小,使用起来非常简便,已有的业务代码几乎不需要做什么修改。栈空间的限制有栈协程的“栈”空间普遍是比较小的,在使用中有栈溢出的风险;原创 2024-07-18 20:19:11 · 923 阅读 · 0 评论 -
C++ 怎么解决死锁问题
当多个线程以不同的顺序锁定相同的多个互斥锁时,可能会导致死锁。这是因为一个线程可能会持有一个互斥锁,并等待另一个线程持有的锁,而第二个线程则持有第二个锁并等待第一个线程持有的锁,从而导致循环等待。在这个示例中,thread1先锁定m1再锁定m2,而thread2则先锁定m2再锁定m1。如果thread1持有m1并等待m2,而thread2同时持有m2并等待m1,这将导致死锁。可以看出程序在编译成功之后没有任何反应,而是“暂停”了。原创 2024-07-17 14:51:56 · 562 阅读 · 0 评论 -
C++ 异步编程之future与promise、async、packaged_task
是C++11中提供异步创建多线程的工具,只能是异步运行任务,却无法获取任务执行的结果,一般都是依靠全局对象,全局对象在多线程下是及其不安全的,为此标准库提供了std::future类模板来关联线程运行的函数和函数的返回结果,这种获取结果的方式是异步的。原创 2024-07-05 17:01:56 · 710 阅读 · 0 评论 -
C++ std::thread 管理线程生命周期:join 和 detach
方法用于同步主线程和子线程。也就是说,当主线程调用子线程的join方法时,主线程会被阻塞,直到子线程完成其执行。这意味着join方法确保主线程等待子线程结束,然后继续执行后续代码。t.join()方法则是让子线程在后台独立运行,与主线程分离。分离后的线程(也称为“游离线程”)不能再被join,它的资源会在该线程完成后自动释放。主线程会继续执行而不会等待该子线程。如果把std::this_thread::sleep_for(std::chrono::seconds(3));原创 2024-07-16 18:00:34 · 1028 阅读 · 0 评论 -
高并发内存池
但如果后面的桶当中都没有span,这时我们就只能向堆申请一个128页的内存块,并将其用一个span结构管理起来,然后将128页的span切分成n页的span和128-n页的span,其中n页的span返回给central cache,而128-n页的span就挂到第128-n号桶中。申请释放的都是固定大小的对象,每个线程申请释放时访问的都是各自thread cache的同一个桶,当thread cache的这个桶中没有对象或对象太多要归还时,也都会访问central cache的同一个桶。原创 2024-07-13 14:25:03 · 654 阅读 · 0 评论 -
C++ std::lock_guard和 std::unique_lock
二者都是 C++ 标准库中用于管理互斥锁(mutex)的 RAII(Resource Acquisition Is Initialization)机制的类。这些类可以确保互斥锁在构造时被获取,在析构时被释放,从而避免死锁和资源泄漏问题。不过,它们在功能和使用方式上有一些重要区别。是一个简单的、轻量级的锁管理器,它在构造时获取锁,在析构时释放锁。其主要特点是不能显式地解锁或重新锁定。每个线程在输出信息时获取了互斥锁,确保了标准输出的操作是原子的,避免了竞争条件导致的输出混乱。原创 2024-07-16 17:31:22 · 577 阅读 · 0 评论 -
C++ 零成本抽象(Zero-cost abstraction)
C++ 的零成本抽象理念使得开发者可以写出高层次的、可读性强的代码,而不用担心额外的运行时开销。通过内联函数、模板、运算符重载、常量表达式和智能指针等特性,C++ 在保持高性能的同时,极大地提高了代码的抽象能力。原创 2024-07-09 15:36:46 · 396 阅读 · 0 评论 -
C++怎么解决不支持字符串枚举?
首先,有两种方法:使用命名空间和字符串常量与使用enum class和辅助函数。原创 2024-07-02 19:53:38 · 416 阅读 · 0 评论 -
C++ unique_ptr
创建一个。原创 2024-07-02 17:37:45 · 339 阅读 · 0 评论 -
C++ lock_guard
以上面的demo1作为例子:假定counter当前值为10,线程1读取到了10,线程2也读取到了10,分别执行自增操作,线程1和线程2分别将自增的结果写回counter,不管写入的顺序如何,counter都会是11,但是线程1和线程2分别执行了一次自增操作,我们期望的结果是12!回到上边的例子,考虑这样一个情况:假设线程1上锁成功,线程2上锁等待。简单的来说:当调用构造函数时,会自动调用传入的对象的lock()函数,而当调用析构函数时,自动调用unlock()函数(这就是所谓的RAII,读者可自行搜索)。原创 2024-06-27 20:33:48 · 607 阅读 · 0 评论 -
C++ 智能指针
内存释放时打印一些日志。管理除内存以外的其它资源,例如文件句柄、数据库连接等。与自定义分配器(Allocator)配合使用,将资源释放给自定义分配器。自定义删除器可以是一个函数,也可以是一个类的对象, 也可以是一个lambda表达式。delete p;delete p;shared_ptr自定义删除器的使用:对于shared_ptr, 不管删除器什么类型,是否有状态都不会增加shared_ptr的大小, 均为两个字长。原创 2024-07-01 16:17:15 · 989 阅读 · 0 评论 -
C++ 包装器(function&bind)
function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。// 函数// 函数对象public:// 类成员函数:静态、非静态class Pluspublic:int main()//1、包装函数指针(函数名)//2、包装仿函数(函数对象)//3、包装lambda表达式//4、类的静态成员函数//&可省略//5、类的非静态成员函数//&不可省略return 0;原创 2024-06-06 20:51:10 · 939 阅读 · 0 评论 -
为什么Meyers’ Singleton是线程安全的
单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。原创 2024-07-01 10:47:45 · 570 阅读 · 0 评论 -
C++ json
https://www.cnblogs.com/LiuYanYGZ/p/18055915c++开源项目nlohmann/json快速上手-CSDN博客原创 2024-07-03 17:58:57 · 114 阅读 · 0 评论 -
C++ 智能指针使用不当导致内存泄漏问题
通过继承MyClass能够安全地在其成员函数中创建返回指向自身的,避免不必要的重复引用计数,从而有效地管理和共享对象生命周期。这样既提升了代码的安全性,也使得对象生命周期管理变得更加简洁和直观。原创 2024-07-04 20:45:40 · 1068 阅读 · 0 评论 -
C++ 面试总结
线程是因为非法访问内存引起的崩溃,那么进程肯定会崩溃,为什么系统要让进程崩溃呢,这主要 是因为在进程中,各个线程的地址空间是共享的,既然是共享,那么某个线程对地址的非法访问就会导 致内存的不确定性,进而可能会影响到其他线程,这种操作是危险的,操作系统会认为这很可能导致一 系列严重的后果,于是干脆让整个进程崩溃。2 效率和性能:使用成熟的协议通常会带来一定的开销,例如协议解析、报文封装等。线程(Thread):是进程中的一个执行单元,是CPU调度和分派的基本单位,同一进程 内的多个线程共享相同的内存空间。原创 2024-06-06 15:17:15 · 653 阅读 · 0 评论 -
C++ 如何解决回调地狱问题
待写。原创 2024-07-03 20:44:48 · 582 阅读 · 2 评论 -
C++ .h&.hpp&.cpp
h.cpp.hpp。原创 2024-06-04 16:46:41 · 605 阅读 · 0 评论 -
C++ explicit关键字
具体地C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的。跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: 上面的代码中, "CxString string2 = 10;" 这句为什么是可以的呢?在C++中, 如果构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对原创 2024-06-05 14:15:32 · 686 阅读 · 0 评论 -
C++ 回调与std::async
声明并定义一个函数A,然后把函数A的指针作为参数传入其他的函数(或系统)中,其他的函数(或系统)在运行时通过函数指针调用函数A,这就是所谓的回调函数。类拥有一个公共成员函数PrintText用于输出字符串。类还具有一个静态成员函数SPrintText,作为一个包装器(wrapper)允许通过调用PrintText来实现接口兼容,使得可以使用它作为回调函数。静态成员函数可以被直接调用而无需类的实例化对象,但它需要显式地将void*类型的参数转换回类型,才能调用非静态成员函数。PRINTTEXT。原创 2024-06-07 20:07:02 · 881 阅读 · 0 评论 -
C++ 类模板和函数模版
class 类模板名//类内成员声明public:cout << "数学:" << _Math << endl;cout << "语文:" << _Chinese << endl;cout << "英语:" << _English << endl;T _Chinese;T _English;// 类模板中的成员函数若是放在类外定义时,需要加模板参数列表public:private:T _Math;T _Chinese;T _English。原创 2024-06-06 14:19:37 · 957 阅读 · 0 评论 -
C++类与对象(中)
结合思维导图与代码实现,助你c++入门!原创 2022-04-25 16:05:18 · 864 阅读 · 0 评论 -
C++类与对象(上)
类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字 public、protected 和 private,分别用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么东西都往里扔。 类的版式主要有两种方式: (1)将 private 类型的数据写在前面,而将 public 类型的函数写在后面,采用这种版式的程序员主张类的设计“以数据为中心”原创 2022-04-22 17:59:42 · 43 阅读 · 0 评论 -
C++入门
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进原创 2022-04-21 21:54:44 · 602 阅读 · 0 评论