
C++
文章平均质量分 65
执笔论英雄
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【DeepSeek学C++】移动构造函数
静态成员属于类本身,而非静态成员属于类的每个实例。因此,当移动一个对象时,静态成员并不属于对象实例的一部分,所以不需要移动。移动操作是针对对象实例的,所以只处理非静态成员。接下来,用户可能需要具体的例子来理解这一点。例如,如果有类中包含静态成员变量,移动操作不会去处理它,因为静态成员是所有实例共享的,移动一个实例不会影响其他实例的静态成员值。原创 2025-03-28 17:23:33 · 1305 阅读 · 0 评论 -
【deepseek 学c++】weakptr引用场景
std::weak_ptr 是 C++ 中与 std::shared_ptr 配合使用的智能指针,它本身不拥有资源的所有权,仅观察资源的状态,主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值:!原创 2025-03-27 17:14:47 · 438 阅读 · 0 评论 -
【Deepseek 学c++】再谈shred_ptr 多重控制块问题
当 ConcreteTask::execute 调用 getSharedThis() 时,会生成一个新的 shared_ptr,其控制块与原 task 的控制块独立。任务完成时,scheduler 持有的 task 和回调中的 shared_ptr 指向同一对象但属于不同控制块,导致对象被重复释放。正确实现:使用 enable_shared_from_this。错误实现:直接使用 this。原创 2025-03-27 12:23:59 · 351 阅读 · 0 评论 -
【DeepSeek学C++】shared_ptr学习
shared_ptrshared_ptr本身是一个对象,通常包含两个指针:一个指向被管理的对象,另一个指向控制块。控制块包含引用计数、弱引用计数以及可能的删除器等。当创建shared_ptr时,控制块会被动态分配,或者如果使用make_shared,可能会将对象和控制块分配在同一块内存中。用户提到“&a是A类对象的地址吗”,这里需要明确区分shared_ptr对象本身的地址和它管理的对象的地址。原创 2025-03-27 11:42:27 · 746 阅读 · 0 评论 -
【DeepSeek 学c++】dynamic_cast 原理
用于向下转化。父类引用指向指类对象假设父亲是a, 子类是b.子类对象A* pa 父类引用指向子类对象,那么向上转化 Apa = pb 这个是自动完成的,隐式转化,不需要dynamic_cast向下转化指的是Apa = new B。这个是指向子类对象的父类引用, 转化为子类引用总结就是 父类 向下转化为子类, 但是父类指针本身是指向子类的。而不是说指向父类的指针转化为指向子类的指针,这个是无法转的。原创 2025-03-21 17:30:33 · 1170 阅读 · 0 评论 -
【deepseek 学c++】decltype
rrtetred原创 2025-03-21 16:22:48 · 114 阅读 · 0 评论 -
【DeepSeek学C++】移动构造函数
首先,str是一个普通的string对象,然后通过std::move(str)将其转换为右值引用,赋值给r。但需要注意的是,虽然r是右值引用类型,但它本身是一个左值,因为它有名字。也就是说,当使用r的时候,它实际上是一个左值,尽管它的类型是右值引用。根据C++的标准,当用一个左值来初始化对象时,如果该左值的类型是右值引用,那么它会被视为左值,所以这里会调用拷贝构造函数,而不是移动构造函数。为了验证这一点,我可以考虑强制将r转换为右值,比如使用std::move®,这时候就会调用移动构造函数。原创 2025-03-20 23:02:52 · 264 阅读 · 0 评论 -
【DeepSeek学C++】 effective modern C++第33条款
等价于auto x = 10。x 是左值类型 , x 推到为int当参数声明为auto x时,无论传入的是左值还是右值,x在内部都会变成具名左值。这个问题涉及到C++中的值传递机制和左值/右值的概念左值和右值的基本定义。左值是指有持久状态的对象,可以取地址的,比如变量名、解引用的指针等。右值则是临时对象,比如字面量或表达式的结果,它们通常无法取地址,生命周期短暂。当函数参数按值传递时,不管是左值还是右值,参数都会被拷贝或移动到函数内部的变量中。这时候,这个内部变量是一个具名的变量,也就是左值。原创 2025-03-20 21:14:59 · 304 阅读 · 0 评论 -
[Deepseek 学c++]初始化捕获与按值(显式与隐式)捕获傻傻分不清
注意以上说法不对。!相当于在lambda函数体中加了一个新的变量auto &a, 其初值为函数作用域内的 static int a;引用,对新的a操作实际还是修改的是static int a相当于 lambda函数体中加了一个新的变量 auto a, 其初值为外部的 static int a;操作是新的a。原创 2025-03-20 16:58:23 · 480 阅读 · 0 评论 -
【Deepseek C++】std:function 内部实现
l详ambda的类型是唯一的,每个lambda表达式都有不同的类型,所以必须通过decltype来获取类型,并在构造时传入该lambda的实例。,因为如果lambda有捕获,它的类型将包含捕获的内容,这可能导致无法作为模板参数使用。因此,在示例中应该使用无捕获的lambda。详细解释std::function 内部实现的多态机制。可以以lambda 表达式的形式给出嘛。初始化捕获, 引用捕获,值捕获区。lambda 表达式底层实现。5. 实现深拷贝的核心代码。原创 2025-03-01 11:44:09 · 308 阅读 · 0 评论 -
【DeepSeek C++】为什么要将基类构造函数设置成protected
例如,如果基类的构造函数是protected的,那么派生类的构造函数在调用基类构造函数时需要显式地使用Base::Base(),而不能隐式调用。总结来说,基类构造函数设置为protected是一种设计选择,用于控制类的实例化和继承关系,确保基类不能被直接创建,只能通过派生类来使用。如果基类的构造函数是public的,那么任何地方都可以直接创建基类的实例。总的来说,基类构造函数设置为protected是一种设计选择,用于控制类的实例化和继承关系,确保类的使用符合设计意图,并提高代码的封装性和安全性。原创 2025-02-19 17:19:31 · 774 阅读 · 0 评论 -
lambda 表达式与mutable
通常情况下,lambda表达式捕获的变量是不可变的,使用mutable关键字可以破坏这种不可变性,允许对捕获变量进行修改。在C++中,mutable关键字和引用捕获方式(&)有不同的用途和效果,它们可以在某些情况下结合使用,但它们的基本功能和影响是不同的。在这个例子中,x既是通过引用捕获的,也是mutable关键字作用的对象。在这个例子中,x是被捕获的变量,mutable关键字使得lambda表达式可以修改x的值。在这个例子中,x是被捕获的变量,mutable关键字使得lambda表达式可以修改x的值。原创 2024-11-15 10:17:30 · 1307 阅读 · 0 评论 -
boost::intrusive_ptr为什么叫做倾入指针
具体来说,boost::intrusive_ptr需要对象类型提供一个自增函数(通常是通过模板参数传递给boost::intrusive_ptr的),这个自增函数负责管理引用计数。与std::shared_ptr和std::weak_ptr不同,boost::intrusive_ptr不管理对象的生命周期,而是依赖于对象的自增函数来管理其引用计数。使用方法:boost::intrusive_ptr的使用方法类似于std::shared_ptr,但需要手动管理对象的自增函数。当引用计数为0时,对象被释放。原创 2024-11-13 11:07:04 · 445 阅读 · 0 评论 -
并发模式下的同步和异步。
一种是半同步半反应堆模式:一种是相对更高效的。两者区别是第二种,每个工作携程有会注册自己的epoll 内核事件表,一种是共有同一个epoll 缓冲区。同时可以了解下epoll, ngix 的惊群问题。linux 高性能服务器中给出了两种半同步半异步的模式。原创 2024-11-07 12:17:44 · 256 阅读 · 0 评论 -
epoll 本身是同步IO模型,但可以实现异步IO模型
水平触发机制在文件描述符上有数据可读或可写时,会通知应用程序,而边缘触发机制在文件描述符上有数据可读或可写时,第一次通知应用程序,第二次通知时,数据可能已经读取或写入。事件注册和取消注册:epoll 允许应用程序在内核中注册和取消注册多个文件描述符,当文件描述符的状态发生变化时,内核会通知应用程序,而不是每次文件描述符的状态发生变化时,都调用一次系统调用。性能优化:**epoll 的设计目标是优化同步IO模型的性能,它通过减少系统调用和内核态到用户态的上下文切换,**提高了同步IO模型的性能。原创 2024-11-07 10:48:41 · 772 阅读 · 0 评论 -
epoll惊群学习
在socket1收到数据后,那么它会被添加到eventloop的就绪列表中,event会唤醒等待队列中的进程。那么是唤醒所有进程么?这样岂不是进程1到9都拿不到自己等待的socket数据,只有在遍历到进程10的时候才能拿到数据。这样子效率会很低啊。如果文件列表中有10个被监听的socket,eventloop的等待队列中有10个进程。如果进程1等待socket10 …进程10等待socket1.如果我的理解有偏差,那么eventloop如何唤醒接受到数据的socket对应的进程呢?原创 2024-11-07 09:50:28 · 215 阅读 · 0 评论 -
C++ 学习资料
https://github.com/0voice/cpp_backend_awsome_blog/blob/main/%E3%80%90NO.65%E3%80%91%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%EF%BC%9Aepoll%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%EF%BC%8C%E8%BF%98%E6%90%9E%E4%B8%8D%E6%87%82epoll%E7%9A%84%E7%9C%8B%E8%BF%87%E6%9D%A5.原创 2024-11-06 16:50:37 · 161 阅读 · 0 评论 -
epoll 技术为什么用rbtree而不用hashmap呢?
epoll 理解,可以参考这个。原创 2024-11-06 16:45:08 · 960 阅读 · 0 评论 -
函数调用运算符和转换运算符
在这个例子中,MyClass类定义了一个构造函数,接受一个int类型的参数,并一个转换运算符,将MyClass对象隐式地转换为int类型。在这个例子中,MyClass类定义了一个构造函数,接受一个int类型的参数,并一个转换运算符,将MyClass对象隐式地转换为int类型。在上面的例子中,integral_constant模板类定义了一个转换运算符,使得integral_constant对象可以被隐式地转换为value_type类型。它允许你将类的对象转换为其他类型,而无需显式地使用转换函数。原创 2024-11-04 16:37:09 · 773 阅读 · 0 评论 -
【学习enable_if模板, 学习unqiue_str 删除操作】
当 T 是算术类型(如 int、float 等)时,std::is_arithmetic::value 为 true,std::enable_if 将生成一个类型 void,因此 print 被实例化,并输出 “Arithmetic type”。当 T 不是算术类型时,std::is_arithmetic::value 为 false,std::enable_if 将生成一个类型 void,因此 print 不被实例化,print 的另一个实例化版本将被选择。原创 2024-11-01 15:41:42 · 559 阅读 · 0 评论 -
【unique_str 源码学习】
deleter_type& get_deleter() noexcept // 获取删除器。原创 2024-11-01 11:54:24 · 736 阅读 · 0 评论 -
赋值运算符以及为什么返回引用
原创 2024-08-26 09:34:51 · 356 阅读 · 0 评论 -
atoi()和stoi()的区别----数字字符串的处理
相同点:①都是C++的字符处理函数,把数字字符串转换成int输出②头文件都是#include<cstring>不同点:①atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const cha...转载 2019-08-06 09:00:00 · 194 阅读 · 0 评论 -
BF算法
原理#include <iostream>using namespace std;#include <string.h>int BF(string S,string T) { int i = 0; int j = 0; while (i < S.length() && j < T.length()) { if (S[...原创 2019-07-26 17:59:31 · 107 阅读 · 0 评论 -
复杂链表的复制
参考:https://www.cnblogs.com/edisonchou/p/4790090.htmlhttps://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba/*struct RandomListNode { int label; struct RandomListNode *nex...原创 2019-06-29 20:07:52 · 120 阅读 · 0 评论 -
剑指offer -二叉树的镜像
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: void Mirror(TreeNode *pRoot...原创 2019-06-27 16:03:53 · 107 阅读 · 0 评论 -
C++中浅拷贝
#include "pch.h"#include <iostream>#include<string.h>using namespace std;class MyString{public: char *buffer;public: MyString(const char * init) { buffer = NULL; cout <&l...原创 2019-06-07 11:18:24 · 227 阅读 · 0 评论