
C++
文章平均质量分 57
利来利往
幽默,诚实,守时,守信,适应能力强。
展开
-
随机函数,洗牌函数 random_shuffle
【代码】随机函数,洗牌函数 random_shuffle。转载 2022-11-18 17:17:09 · 170 阅读 · 0 评论 -
【C++】记录一次代码优化,28490行代码优化到1401行代码
记录一次代码优化,28490行代码优化到1401行代码----优化背景,游戏需要做一个旁观功能,那么需要修改的地方有入座和广播。目前看代码是有110个麻将和牌类,代码相似度99.9%,只有一个枚举不一样(游戏id).功能是很简单,入座的协议加个字段是否旁边,广播的时候给旁边的玩家也发消息。但是涉及到一百多个游戏,我也可以每个游戏都改一遍,但是如果有bug,或者还需要修改,不是很麻烦吗。所以必须把相同的代码抽出来形成通用函数,每个游戏调用通用函数,不一样的再特殊处理。.........原创 2022-08-31 15:27:59 · 1171 阅读 · 0 评论 -
[C++]用类继承实现容器放不同类型
【代码】[C++]用类继承实现容器放不同类型。原创 2022-08-30 15:11:48 · 378 阅读 · 0 评论 -
[json]C++读取json文件
封装的接口 JsonConfig.h。测试代码配置 games.json。资源信息有json库。原创 2019-08-20 13:28:59 · 913 阅读 · 0 评论 -
【C++】文件读写
在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O原创 2022-08-16 16:40:41 · 493 阅读 · 0 评论 -
【C++】静态函数的继承
代码】【C++】静态函数的继承。原创 2022-08-16 16:15:38 · 830 阅读 · 0 评论 -
【C++面试题】多线程不加锁消息队列
前文跟大家一起赏析了大师作——redis的事件机制,今献丑将自己常用的一个消息循环分享给大家。笔者认为没有任何算法能完美的适配所有场景,就像前文提到的redis事件机制,它其实在处理就绪事件时是阻塞执行的。如果同时就绪的多个事件中有比较耗时的运算,那等待其他事件完成的用户体验就不太好了。本文设计的环形队列是多线程并发执行时可用的,一次往队列中写入一个事件,队列只记录事件相关数据的指针,另外使用原子操作来记录读取这个指针,迅速、安全。因为指针占空间小而且一致,所以直接用数组来保存它们。如下图所示:假设数组大小转载 2022-07-13 00:34:36 · 792 阅读 · 0 评论 -
【C++面试题】一个野指针拦截工具的基础原理
刷微博看到大佬分析评价了一个库对野指针拦截处理,通读之后若有所思,随即点了收藏。大概过了两周,重新翻看这条分析,发现自己并没有完整理解消化了这个野指针拦截原理,之前收藏的时候评论了原博,希望博主贴个源码地址学习一下~然而大佬并没有回复,于是自己试着用截图里的keyword去搜了下,最终还是找到了--> JJException这个库的野指针拦截处理的原理其实就是模仿Xcode的僵尸对象捕获的功能(即Zombie)正在上传…重新上传取消Zombie.png套用大佬的话:hook了dealloc,然后对该对象的内转载 2022-07-13 00:10:03 · 182 阅读 · 0 评论 -
【C++面试题】共享内存
共享内存的创建与释放原创 2022-07-12 23:56:29 · 464 阅读 · 0 评论 -
【C++面试题】虚函数的原理
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。当然,相同的转载 2022-06-23 16:56:17 · 171 阅读 · 0 评论 -
【面试】C++_ 11
1.C++怎么实现禁止拷贝2.C++11(1).C++右值引用与左值引用(2).智能指针1.最容易想到的是将拷贝构造函数与赋值函数声明为private。但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问。那么怎么办呢?2.在类中,允许声明函数,但是,可以不用实现该函数,这是合法的。那么即使是在public中声明函数,但是不实现,那么调用这个函数也是会出错的。那么好了我们可以特性一起使用,将拷贝构造函数与赋值函数,声明为private,并且不给出实现。这.原创 2021-04-23 17:58:28 · 220 阅读 · 0 评论 -
【面试】C++_指针
1.指针引用区别2.智能指针的原理3.指针引用占用的内存大小4.怎么解决C++的空指针,野指针问题1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已(2)引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。(3)可以有const指针,但是没有const引用;(4)指针可以有多级,但是引用只能是一级(int **p;合法 而原创 2021-04-19 14:09:49 · 184 阅读 · 0 评论 -
【面试】C++_数据结构_链表
链表怎么判断一个链表是环形,6或9形状呢,怎么判断二个链表合成一个链表,时间和空间复杂度方法一:哈希表法这里我们采用set这一关联容器。设置set的下标为ListNode*,遍历该链表的每一个结点,将未出现过的链表结点存储至set中,会出现两种情况:发现指向某一结点的指针已经存储过了,就说明这个链表是环形的。发现指向某一结点的指针是NULL,则说明这条链表有尾巴,不是环形的。方法二:快慢指针法我们可以思考一个问题:两位运动员在环形跑道上什么情况下会相遇?是当他们速度一致吗?显然不是,原创 2021-04-19 13:02:33 · 97 阅读 · 0 评论 -
【面试】C++_内存
1.内存有哪些问题2.怎么解决内存问题3.内存越界会怎么样,4.内存越界为什么会蹦5.发现内存泄漏方法6.内存优化7.内存池8.对象池内存越界内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。另外一种是写越界,又叫缓冲区溢出。它会产生不可预料的后果,比如把程序返回地址改掉了,使函数返回时跳到未知内存,导致崩溃。野指针野指针,也原创 2021-04-19 12:13:25 · 106 阅读 · 0 评论 -
【面试】C++_多线程
多线程你们那些地方用了多线程你们用的什么锁锁有很多类型 pthread 用的什么锁pthread 关闭线程的方法消息队列多线程的问题//取消线程pthread_cancel(tid); 线程里面一般都有while true,while加个条件,在外部改变条件也可以让线程退出线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。1、互斥锁互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻.原创 2021-04-18 23:25:47 · 435 阅读 · 0 评论 -
【面试】C++_stl
1.stl常用容器的选择2.stl,你用得比较多的是那些,他底层怎么实现的,3.vector他的内存管理4.stl的内存管理5.stl的map是什么数据结构6.哈希map和map查询的性能差异利用他们的特性vector会根据push的先后顺序排序缺点:一个动态分配的数组(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间);应用:背包map会根据key排序应用:玩家管理的容器queue应用:消息队列listsort()函数就是对list中的元素进...原创 2021-04-18 22:48:53 · 81 阅读 · 0 评论 -
【面试攻略】C++面试-新湃传媒
新湃传媒1.自我介绍2.说说你最近项目的架构3.你做了哪些架构优化4.你做过mmorpg吗,他的架构怎么样的5.你对分布式架构的理解6.分布式架构怎么保证节点副本数据一致性7.你对数据库做了哪些优化8.你了解红黑树吗,他的特性8.你对数据库的索引了解吗9.你了解b+树的数据结构了吗10.你对tcp了解吗11.你有什么要问我们的吗...原创 2020-12-20 00:56:57 · 225 阅读 · 2 评论 -
华为机试算法题
一共三道题,150分钟,第一二题200分,第三题400分,听说150分算过。主要是只告诉你通过率,没告诉你正确答案和你的错误答案做对比,不知道自己哪里漏了。/*第一题1-100围城一个圈,重1开始数,如果等于给定的数就删掉,继续数, 直到剩余的数量小于给定的数。此题100%通过输入3输出58,91输入4输出34,45,97*/#include <iostream>#include <string.h>#include <map>.原创 2020-12-10 02:43:20 · 1175 阅读 · 0 评论 -
【C++服务端技术】消息队列
ThreadWorkUnit.h#pragma once#include <queue>#include <pthread.h>#include "SafeQueue.h"namespace Extralib{ namespace Thread { //消息結構體 struct sWorkItem { sWorkItem() { type = 0; nDataSize = 0; pData = NULL;原创 2020-12-08 10:44:54 · 307 阅读 · 0 评论 -
【C++服务端技术】智能锁
#pragma once#include <pthread.h>namespace Extralib{ namespace Thread { /* * 利用对象生存周期自动加解锁,比较安全 */ class AutoLock { public: pthread_mutex_t& m_locker; public: AutoLock( pthread_mutex_t& locker ):m_locker(locker) {.原创 2020-12-08 10:25:30 · 508 阅读 · 0 评论 -
【C++服务端技术】队列
链表和锁实现的队列,锁的代码请看其他文章#pragma once#include <list>#include "AutoLock.h"namespace Extralib{ namespace SafeQueue { using namespace Thread; template<typename Data> class safe_queue { private: std::list<Data> the_queue;原创 2020-12-08 10:20:20 · 101 阅读 · 0 评论 -
【C++服务端技术】对象池
代码没贴全,就少一个锁头文件,可以做设计参考设计思想就是维护一个空闲链表,没有用的就重新申请,有的话就拿链表的头,使用完又还给空闲链表。/*一个分配固定大小内存的内存池,使用链表维护*/#pragma once#include <list>using namespace std;#include "../Thread/AutoLock.h"using namespace Extralib::Thread;struct Link{ Link* m_pNext;}原创 2020-12-08 10:02:32 · 166 阅读 · 0 评论 -
【C++服务端技术】移动广播
/*基于9宫格的移动广播,进入视野离开视野1.根据玩家的xy左右计算玩家移动之前和移动之后的格子id2.根据格子id计算附近的格子,附近格子里面的玩家成为附近玩家3.向新减少的格子的玩家发送离开视野,向新增的格子的玩家发送进入视野*/bool Room::HandleOnMove( IRole * pRole ){ if(NULL == pRole) return false; Room *pRoom = pRole->GetRoom(); i...原创 2020-11-23 13:54:24 · 231 阅读 · 0 评论 -
【C++服务端技术】定时器
这个设计每调用一次就会重新注册,欢迎交流#include <iostream>#include <map>#include <vector>#include <time.h>#include <windows.h>#include <stdio.h>using namespace std;struct tagTime{ long long llStarTime; int iCount; int原创 2020-11-21 16:26:20 · 230 阅读 · 0 评论 -
C++11
发现这个经常被问到,恰好我工作中C++11用得不多。。。1.Initiallizer list2.auto type 大爱3.foreach 写c++像是再写c#4.nullptr 代替了c++ 03的NULL5.enum class代替了c++03的enum,更安全6.override关键标识 for virtual function (更加安全,直观 )7.final关键标识 ,主要是class 及virtual function8.关键字default标识, compiler转载 2020-11-05 15:54:53 · 278 阅读 · 0 评论 -
C++-发现内存泄漏方法+解决玩家网络卡的问题
1.发现内存泄漏方法用一个静态变量来记录这个类当前存活的数量,在需要监控的类的基类的构造函数里计数+1,在析构函数里计数-1。2.在WP微信中是如何发现内存泄漏的。WP微信使用对象计数的方式来初步发现内存泄漏,如果已经离开一个页面,但这个页面仍然有存活的实例,那么就说明这个页面发生泄漏了。可见要发现UI的内存泄漏,还是很容易的。怎么解决玩家网络卡的问题1.客户端插值(解决卡顿):当客户端A收到服务端发来的玩家B的位置,不是直接瞬移到数据包中指定的位置 ,而是使用插值的方法平滑地插值到新的位置转载 2020-10-28 23:02:27 · 213 阅读 · 0 评论 -
C++面试基础篇
基础篇1.const *和* const的区别如果const修饰在*p前则不能改的是*p,而不是指p;如果const是直接写在p前,则p不能改举个栗子:int i1=30int i2=40;const int *p = &i1p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。p=&i2; //正确 *p=i2; //错误 int * const p指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。p.原创 2020-10-24 16:57:44 · 143 阅读 · 0 评论 -
【手游项目4】手动拆包逻辑
比如我们和前端互通的包大小限制是4K,如果发一个大于4K的包就无法发送,这时候就需要和前端拆包和包。bool LobbyServer::SendPbMsgToClient(PlayerNode *lpPlayerNode, unsigned short type, void *buf, long len, int end){ __log(_ERROR, __FUNCTION__, "type[%d],len[%d],end[%d]", type, len, end); tagNetMsg pNe原创 2020-06-26 23:22:49 · 978 阅读 · 0 评论 -
[手游项目4]GM系统,消息映射
#include <string>#include <map>#include <vector>#include "LobbyPlayer.h"#include "LobbyServer.h"using namespace std;typedef bool(*NetMsgProcProtoType)(LobbyPlayer* pPlayer, vector<int> &args);struct NetMsgFunction{..原创 2020-06-03 17:27:43 · 304 阅读 · 0 评论 -
[手游项目4]-24-Linux下实现C语言的HTTP请求实现
第三部分 网络编程 (8 Linux下实现C语言的HTTP请求实现)https://blog.youkuaiyun.com/u013162035/article/details/80843720编译环境安装curl-7.59.0.tar 安装$tar -zxvf curl-7.59.0.tar.gz$cd curl-7.59.0sudo ./configuresudo make ...原创 2019-12-05 22:05:53 · 193 阅读 · 0 评论 -
使用notepad++ 安装NppFTP 远程连接Linux
使用notepad++ 安装NppFTP 远程连接Linuxhttps://blog.youkuaiyun.com/guoyuannan/article/details/77168387Notepad++远程连接Linux系统https://jingyan.baidu.com/article/d8072ac4791d0cec94cefd7c.html...转载 2019-11-09 22:26:16 · 1294 阅读 · 0 评论 -
C++学习资源
按字母顺序Compiler: Borland C++ Compiler for Windows 5.5 http://www.codegear.com/downloads/free/cppbuilder 免费,只能在Windows下使用,并且版本很老 Cygwin http://cygwin.com Windows下的Li转载 2013-01-02 17:20:56 · 1272 阅读 · 0 评论 -
排序
#include using namespace std;void sort_(int test[],int nLen){ int j = 0; for(int i = 1;i<nLen;i++) { int temp = test[i]; j=i-1; while(temp < test [j]) { test[j+1] = test[原创 2012-12-17 00:24:36 · 506 阅读 · 0 评论 -
自动锁
想想这么一个函数: int fun(int x) { lock(...); if (...) return 1; else if (...) return 2; else throw ...; unlock(...);} 这个时候,我们忘掉解锁的机会就太大了,多个return语句,以及可能出现的异常抛出。都有可能导致我们忘转载 2012-11-14 10:24:24 · 701 阅读 · 0 评论 -
static三种用法
1.用于变量前,表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为静态函数:private void s(){static int a=1;a++;}方法第一次调用结束后a在内存内值为2;方法第一次调用结束后a在内存内值为3;2.在方法(函数)前用 static修饰,表示此方法为所在类或所在自转载 2012-09-09 14:30:37 · 3854 阅读 · 1 评论 -
C++中构造函数的执行顺序
一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才执行其构造函数。二、任何抽象基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)三、任何虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)四、任何非虚拟基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序)五、任何成员对象的构造函数按照它们转载 2012-09-17 14:47:53 · 1182 阅读 · 0 评论 -
extern使用方法总结
Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义。谨记:声明可以多次,定义只能一次。 函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的。但是引用的时候一样是需要声明的。而全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此转载 2012-09-09 14:33:05 · 875 阅读 · 0 评论 -
模版
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别转载 2012-12-16 13:41:13 · 588 阅读 · 0 评论 -
define与inline的区别
介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如#define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏。 为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转转载 2012-06-29 15:04:12 · 656 阅读 · 1 评论 -
union
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。首先看一段代码:union myun {struct { int x; int y; int z; }u; int k; }a; int main() {转载 2012-09-09 14:35:11 · 828 阅读 · 1 评论