
C++
Tony_Xian
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leveldb学习2
leveldb原创 2022-08-01 19:17:57 · 507 阅读 · 0 评论 -
C++开源项目
1.leveldb2.srs3.workflow4.ZLMediaKit原创 2021-12-14 23:08:07 · 1064 阅读 · 0 评论 -
C++智能指针
https://blog.youkuaiyun.com/leeds1993/article/details/54563918https://cloud.tencent.com/developer/article/1517336https://blog.youkuaiyun.com/chansoncc/article/details/83183758转载 2021-02-06 16:14:09 · 172 阅读 · 0 评论 -
GDB调试基本命令
GDB调试步骤使用gdb调试时,需要在编译时使用-g参数 g++ -g test.cpp -o test gdb ./test 常用命令:start #开始调试,停在第一行代码处,(gdb)start l #list的缩写查看源代码,(gdb) l [number/function] b <lines> #b: Breakpoint的简写,设置断点。...转载 2020-12-12 15:54:49 · 249 阅读 · 0 评论 -
erlang和C++通信使用protobuf
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#include <iostream>#include <google/.原创 2020-05-30 10:19:20 · 303 阅读 · 0 评论 -
函数返回值、引用和指针的区别思考
学了引用、指针后,这些概念被教材拿去和函数搅在一起,于是使人感到很糊涂。涉及到函数返回的到底是值,引用还是指针的问题,其实就是函数返回的过程中和函数结束的过程中,哪些保留了,哪些复制了,哪些被处理掉的问题。我是这样理解的:首先说函数内的对象的保留和处理——当函数结束的时候,所有除了堆中的对象(不考虑传入了什么样的参数的前提下)之外的函数成员,全部都会被处理掉,无法保留;其次,在返回的过程中,其...转载 2020-05-05 17:44:37 · 3298 阅读 · 0 评论 -
C++自己实现一个String类
C++自己实现一个String类(构造函数、拷贝构造函数、析构函数和字符串赋值函数)#include <iostream>#include <cstring>using namespace std;class String{public: // 默认构造函数 String(const char *str = nullptr); //...转载 2020-04-30 09:34:09 · 1420 阅读 · 0 评论 -
STL之迭代器指针的使用注意事项
如下情况:循环遍历删除容器中的元素for (auto it=vecSalary.begin(); it != vecSalary.end(); ++it) { if(*it < 2) { vecSalary.erase(it); } }看似正确,但仔细分析下,在删除某个元素时,该元素的后一位会自动向前移动一位,以保持vector的连续性,这时迭代器指向的...转载 2020-04-29 21:55:46 · 381 阅读 · 0 评论 -
必须在构造函数初始化列表里初始化的数据成员有哪些
必须使用【初始化列表】初始化数据成员的情况类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员;2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因:原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的...转载 2020-04-29 21:42:09 · 1980 阅读 · 0 评论 -
C++中虚函数的作用和虚函数的工作原理
1 C++中虚函数的作用和多态虚函数:实现类的多态性关键字:虚函数;虚函数的作用;多态性;多态公有继承;动态联编C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法为虚方法。当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即B b; A a = &b;] 父类...转载 2020-04-21 13:09:05 · 334 阅读 · 0 评论 -
构造函数不可以声明为虚函数,析构函数可以声明为虚函数
构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数。不建议在构造函数和析构函数里调用虚函数。构造函数不能声明为虚函数的原因?构造一个对象时,必须知道对象实际类型,而虚函数是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功,编译器就无法知道对象的实际类型,是该类本身,还是派生类,还是其他。虚函数的执行依赖于虚函数表,而虚函数表是...转载 2020-04-14 17:15:04 · 1107 阅读 · 0 评论 -
protobuf 数据解析的2种方法
方法1:message person{required int32 age = 1;required int32 userid = 2;optional string name = 3;}message test{required int32 time = 1;required int32 userid = 2;required float price = 3;o...原创 2020-03-27 19:45:12 · 2545 阅读 · 0 评论 -
kbengine消息处理函数注册
在 kbengine 的任何一个服务器的目录下都存在几个含 interface 单词的文件,它们都跟消息处理相关。以 baseappmgr 为例,我们进入 baseappmgr 的目录,输入ls *interface*。会发现如下几个文件,baseappmgr_interface.cpp baseappmgr_interface.h baseappmgr_interface_macros....转载 2020-03-11 19:43:49 · 371 阅读 · 0 评论 -
kbengine 加载流程
一. 登录流程注册Unity3d:CreateAccountLoginapp:reqCreateAccount -> dbmgr:reqCreateAccount -> Loginapp:onReqCreateAccountResult -> Client:onReqCreateAccountResult登录 Step1Unity3d:loginL...转载 2020-03-11 19:43:00 · 484 阅读 · 0 评论 -
kbengine 网络底层
一. network部分EndPoint:抽象一个Socket及其相关操作,隔离平台相关性。TcpPacket:代表一个TCP包,这个包只是recv收到的字节流,并不是上层协议中的消息(Message)。MsgHandlers:每个MessageHandler类对应一个消息的处理。MsgHanders维护MsgId -> MsgHandler的映射。Channel...转载 2020-03-11 19:42:15 · 610 阅读 · 0 评论 -
kbengine 常见问题汇总
Q: KBEngine是什么,能用来做什么?A: KBEngine是一个通用网络游戏服务器引擎,适合绝大多数中心拓扑结构的网络游戏,包括但不限于即时和回合制MMORPG、副本类、房间类、卡牌、棋牌等。不适合基于P2P技术的游戏类型。Q: 服务器的网络协议用的是什么?A: 组网时用UDP协议,其他情况下服务器模块之间、服务器和客户端之间用的都是TCP协议。Q: KBEngine是多线程的吗?...转载 2020-03-10 20:16:35 · 308 阅读 · 0 评论 -
KBEngine关于网络部分
整个网络接口是在network_interface.h和network_interface.cpp开始。配置信息参考/assets/res/server/kbegine.xml,这里是网络对外的所有接口。EventDispatcher类是管理事件的一个类,里面有注册/取消读写描述符,添加处理任务,出错包处理,创建epoll模型。其中是注册/取消读写描述符通,创建epoll模型过EventP...转载 2020-03-10 14:34:14 · 383 阅读 · 0 评论 -
boost.asio新框架的设计概念总结
1.66版本,boost.asio库重新设计了框架,目前最新版为1.71。读了几天代码后,对框架中相关概念总结。因为是泛型编程的库,所以分析的概念层的设计。可通过boost官方文档,strand的1.65和1.66两版本文档比较,查证ts和io_context, executor首次出现在1.66。新框架有几个核心概念,Context,Scheduler,Service,Executor,...转载 2020-03-10 14:16:56 · 663 阅读 · 0 评论 -
Trinitycore数据库分析
https://blog.youkuaiyun.com/qq51931373/category_6278261.html转载 2020-03-08 23:43:20 · 895 阅读 · 0 评论 -
CMake 报错处理
CMake Error: The current CMakeCache.txt directory /home/alex/soft/opencv-2.4.13.6/release/CMakeCache.txt is different than the directory /home/alex/tmp/opencv-2.4.13.6/release where CMakeCache.txt was...转载 2020-02-21 10:52:02 · 674 阅读 · 0 评论 -
C++中友元函数和成员函数的区别
什么是友元函数:指某些虽然不是类的成员却能够访问类的所有成员的函数为什么要使用:为了使其他类的成员函数来访问该类的私有变量什么时候使用:可以用于运算符重载两个类共享数据调用方式:不是类的成员函数,调用时不通过对象存在位置:可以在类内声明,类外定义,可放在类的私有段或公有段,放在私有段和公有段无区别。什么是成...转载 2020-02-14 11:46:42 · 2231 阅读 · 0 评论 -
C++ override 关键字用法
override关键字作用: 如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。 举例子说明struct Base { virtual void Turing() = 0; virtual void Dijkstra() = 0; virtual void VNeumann(int g) = 0...转载 2020-02-14 11:26:27 · 527 阅读 · 0 评论 -
C++数组越界问题
你要首先了解内存分配的原理。 你在new操作之后,系统可能返回一个新分配的内存,也可能从已经分配并已经回收的内存中拿出来一个小块给你。 至于这块内存后面的那一部分(也就是a[3])是否能被访问,是不确定的。我举几个例子吧(不知道你能不能够理解,我尽力而为):1,这个内存后边的内存是非法内存,例如这个内存后面的部分还没有被你的程序申请过,它已经位于堆内存管理的末端,那么这种情况a[3]赋值程序直接...转载 2020-02-11 22:18:31 · 1182 阅读 · 0 评论 -
return *this和return this
别跟我说, return *this返回当前对象, return this返回当前对象的地址(指向当前对象的指针)。正确答案为:return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。return this返回当前对象的地址(指向当前对象的指针), 下面我们来看看程序吧:#include <iost...转载 2020-02-06 18:30:10 · 335 阅读 · 0 评论 -
C++this指针干什么用的
class Test{public: void func(){ cout<<"mvalue:"<<mvalue<<endl; }private: int mvalue;}; int main(){ Test t1,t2; t1.func(); t2.func(); retu...转载 2020-02-06 18:11:34 · 163 阅读 · 0 评论 -
c++中extern用法总结
extern关键字的作用是共享代码。一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明。(注意:在一个程序中,变量只能被定义一次,但可以多次声明)区分是定义还是声明关键在于看计算机是否为变量分配了存储空间。int i;//这是定义extern int i;//这是声明ext...转载 2020-02-06 17:07:20 · 768 阅读 · 0 评论 -
forgottenserver源码解析
处理连接和收包:mainLoader(otserv.cpp) => ServiceManager::add(server.h) =>ServicePort::open =>ServicePort::accept =>ServicePort::onAccept(这三个函数都在server.cpp) =>Connection::accept =>Con...原创 2020-02-05 22:07:28 · 246 阅读 · 0 评论 -
使用epoll时需要将socket设为非阻塞吗?
我觉得只有边沿触发才必须设置为非阻塞。边沿触发的问题:1. sockfd 的边缘触发,高并发时,如果没有一次处理全部请求,则会出现客户端连接不上的问题。不需要讨论 sockfd 是否阻塞,因为 epoll_wait() 返回的必定是已经就绪的连接,所以不管是阻塞还是非阻塞,accept() 都会立即返回。2. 阻塞 connfd 的边缘触发,如果不一次性读取一个事件上的数据,会干扰下一...转载 2020-02-03 20:29:12 · 872 阅读 · 0 评论 -
epoll比select和poll高效的原因
我们通过比较select、poll和epoll处理I/O的过程来剖析其中的原因:1. 用户态将文件描述符传入内核的方式:select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。poll:将传入的struct pollfd结构体数组拷贝到内核中进行监听。epoll:执行epoll_create会在内核的高速cac...转载 2020-02-02 17:09:46 · 637 阅读 · 0 评论 -
epoll模型水平触发、边沿触发优缺点对比
epoll模式下的水平触发、边沿触发1,epoll默认是水平触发2,水平触发通俗来讲:只要有数据,epoll_wait函数就一直返回;边沿触发通俗来讲:只有socket状态发生变化,epoll_wait函数才会返回。3,水平触发优、缺点及应用场景:优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。缺点:由于只要还有数据...转载 2020-02-02 17:03:55 · 1675 阅读 · 0 评论 -
muduo网络框架分析
概要muduo是一个纯异步、多线程、多路复用网络框架,主线程负责监听网络连接事件,子线程负责处理已建立的连接的网络读写事件。采用eventfd实现父、子线程之间的通信。子线程之间是不能直接进行通信的,原因在于,子线程之间互相不知道对方是否已经析构,也就是一个子线程很有可能向另外一个已经退出的子线程递交任务,这样就会造成程序崩溃。muduo网络框架是基于生产者消费者模型的。每一个线程都维护了...转载 2020-02-01 16:46:20 · 756 阅读 · 0 评论 -
sizeof() 类大小,空类大小
一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小.首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等...转载 2020-02-01 11:14:21 · 479 阅读 · 0 评论 -
详解 c++ 关键字 explicit
用了很久的C++ 了,今天突然被小伙伴问道,构造函数前的explicit 关键字什么作用,于是自己也只能支支吾吾的说出“为了显式调用……”很尴尬啊……典型的知道所以然不知道其所以然……好吧,搜搜资料好好地充充电……首先说定义,C++ 中的explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显式的,而非隐式的。跟他对应的另一个关键字是implici...转载 2020-01-21 17:31:10 · 1114 阅读 · 0 评论 -
C++ 中explicit关键字详解
https://blog.youkuaiyun.com/l2563898960/article/details/97769569转载 2020-01-21 17:21:08 · 109 阅读 · 0 评论 -
C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现1.构造函数构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同)首先说一下一个C++的空类,编译器会加入哪些默认的成员函数·默认构造函数和拷贝构造函数·析构函数...转载 2020-01-21 14:42:30 · 168 阅读 · 0 评论 -
C++的运算符重载
https://blog.youkuaiyun.com/jacket_/article/details/89714947转载 2020-01-21 10:40:41 · 106 阅读 · 0 评论 -
【C++】智能指针详解
https://blog.youkuaiyun.com/flowing_wind/article/details/81301001转载 2020-01-20 11:29:00 · 210 阅读 · 0 评论 -
C++ protobuf示例
$ protoc ./person.proto --cpp_out=./https://blog.youkuaiyun.com/liuxiao723846/article/details/99884741转载 2020-01-17 16:15:32 · 271 阅读 · 0 评论 -
c++11实现的一个消息总线框架
最近在看C++11的特性,然后按照网上的例子实现了一个消息总线框架。https://github.com/hejiajie1989/MessageBus项目里README文档里有详细的设计说明,使用的时候g++ test.cpp -o test -std=c++11g++ TestMessageBus.cpp -o TestMessageBus -std=c++11原文链接:...转载 2020-01-17 14:27:36 · 875 阅读 · 0 评论 -
muduo解包消息分发
1.dispatcher_.registerMessageCallback 这个会将回调函数存入ProtobufDispatcher的std::map中,其中T::descriptor()为key2.client_.setMessageCallback(std::bind(&ProtobufCodec::onMessage, &codec_, _1, _2, _3)) 设置消息...原创 2020-01-17 11:34:54 · 227 阅读 · 0 评论