
工作累积技术
文章平均质量分 59
工作经验总结
昔拉天使
I wanna the world know my existence.
展开
-
关于C++ const的全面总结
c++ 函数前面和后面 使用const 的作用:前面使用const 表示返回值为const后面加 const表示函数不可以修改class的成员cosnt修饰指针const修饰指针,涉及到两个很重要的概念,顶层const和底层cosnt指针自身是一个对象,它的值为一个整数,表明指向对象的内存地址。因此指针长度所指向对象类型无关,在32位系统下为4字节,64位系统下为8字节。进而,指针本身...原创 2020-03-18 04:33:40 · 167 阅读 · 0 评论 -
C++中指针和引用的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。1.指针和引用的定义和性质区别:(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定...原创 2020-03-06 15:06:56 · 1682 阅读 · 0 评论 -
new与malloc有什么区别
前言几个星期前去面试C++研发的实习岗位,面试官问了个问题:new与malloc有什么区别?这是个老生常谈的问题。当时我回答new从自由存储区上分配内存,malloc从堆上分配内存;new/delete会调用构造函数/析构函数对对象进行初始化与销毁;operator new/delete可以进行重载;然后强行分析了一下自由存储区与堆的区别。回来后感觉这个问题其实回答得不怎么好,因为关于new...原创 2020-01-12 01:16:05 · 478 阅读 · 1 评论 -
C++常见面试问题解答
1、如何理解面向对象?把一组数据结构和处理它们的方法组成对象,把相同行为的对象归纳为类,通过类的封装隐藏内部细节,通过类的继承实现特化、泛化,通过多态实现基于对象类型的动态分派。2、面向对象和基于对象的区别?面向对象的三大特点(封装,继承,多态)缺一不可。基于对象是过程化语言自然演进而来,属于结构化编程。3、函数多态有什么用?函数多态有两种表现形式(重载和覆盖),相同名称的函数声明时传递...原创 2020-02-11 04:43:49 · 715 阅读 · 0 评论 -
作为一名合格C++程序员应该避免的一些坑
以下例子只有父类的析构函数被调用了。子类的析构函数并没有被调用,则产生错误。这一点上,对于原始的指针、类或者std::unique_ptr。其表现是一致的。也符合C++基本的语法。但是对于std::shared_ptr。即便父类析构函数并非虚函数,其子类的析构函数依然可以被调用。对于此种行为的原因尚未查明(待更新)。也许这是std::shared_ptr专门设计的一种特性。但为谨慎起见,我们...原创 2020-01-17 15:29:44 · 559 阅读 · 0 评论 -
技能系统解析
技能系统需要根据当前的项目来划分,例如:ACT游戏与MOBA游戏就有一些区别。ACT游戏大部分为了追求打击感使用的是角色身上碰撞盒来触发做技能,ACT游戏追求技能的衔接与多样性。MOBA游戏就不一样,MOBA技能的触发是由玩家点击释放,技能流程大部分也是根据动画帧一套做到底,多技能衔接绝对没有ACT要求那么高。我们这里将要讲的是用于MOBA/ARPG游戏的技能系统,ACT游戏可作为参考,很多地方是大同小异的。...转载 2022-08-11 15:56:06 · 1390 阅读 · 0 评论 -
如何实现一个强大的MMO技能系统
文章目录如何实现一个强大的MMO技能系统——序章前言如何实现一个强大的MMO技能系统——AOI前言正文总结如何实现一个强大的MMO技能系统——技能前言正文总结示例如何实现一个强大的MMO技能系统——BUFF前言正文第一节:Buff定义第二节:Buff执行流程第三节:Buff修改状态(ModifyState)第四节:Buff修改属性(ModifyAttribute)第五节:Buff修改运动(ModifyMotion)第六节:Buff监听事件总结示例如何实现一个强大的MMO技能系统——子弹前言正文总结示例如何实转载 2022-04-07 04:28:28 · 2870 阅读 · 0 评论 -
mysql数据导入到redis_快速将MySQL的数据导入Redis
简介通过pipe将MySQL数据批量导入Redis,自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redis Mass Insertion,即Pipe传输,现在的业务场景是将mysql中某张表的所有数据传输到redis中存储起来。大致思路是用MySql的concat()方法将查询出来的数据按照resp协议的格式拼接成redis命令集合,再通过redis-cli --pipe批量执行命令redis存储设计假设数据库为test,表结构如下:create database转载 2022-03-31 04:28:31 · 3444 阅读 · 0 评论 -
java服务器gc停顿_JVM的GC停顿时间过长该怎么处理?
应用运行过程中是不希望出现长时间的GC停顿的,因为这会影响服务的可用性,导致用户体验变差,甚至会严重损害一些关键的应用程序。本文将会列出可能导致GC停顿时间长的一些原因和解决方案。1. 对象创建的速度过高如果应用创建对象的速度非常高,随之而来的就是GC频率也会变快,然后会导致GC的停顿时间变长。所以说,优化代码以降低对象的创建速率是降低GC停顿时间最有效的方法。这可能是一件非常耗时的事情,但是却非常值得去做。可以使用JProfiler, YourKit, JVisualVM这样的性能监控工具来帮助优化转载 2022-03-31 04:08:53 · 3329 阅读 · 0 评论 -
服务器查找死循环
当服务器上出现死循环的时候,运行top命令,查看占用cpu较高的进程运行命令:jstack –l 进程号 >文件运行命令:top –H –p 进程号。(查找到一个新的PID)将新的PID数字转换为十六进制。(24245转换为十六进制是5eb5)查看刚才写入的那个文件(1.txt),查找转换为十六进制后的数字,查看相关信息!步骤结束!!...原创 2022-02-28 14:12:07 · 759 阅读 · 0 评论 -
c++编译过程简介
了解编译过程的益处c++工程相关的问题什么是库?静态库和动态库又有什么区别?头文件起什么作用?编译过程简介名词:编译:把源文件中的源代码翻译成机器语言,保存到目标文件中。如果编译通过,就会把CPP转换成OBJ文件。编译单元:每个cpp就是一个编译单元,每个编译单元相互之间是独立且相互不知的。一个编译单元(Translation Unit)是指一个.cpp文件以及这所include的所有.h文件,.h文件里面的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文转载 2022-02-21 14:46:00 · 1159 阅读 · 0 评论 -
C++结构体序列化和反序列化方法
unsigned char* EncodeCommonStruct(const CommonStruct_st& CommonSt){ //分配内存 unsigned char* strBuff = (unsigned char*)malloc(CALC_COMMON_ST_LEN(&CommonSt)); if (NULL == strBuff) { return NULL; } //填充内容 *(long*)s转载 2021-05-15 11:42:16 · 4194 阅读 · 0 评论 -
Linux修改的文件“修改时间”
//文件修改时间设置为:2018年7月13日 14:12:02# touch -t 201807131412.02 test.txtor# touch -d "2008-07-11 03:41:10" test.txt# stat test.txt转载 2021-04-21 14:43:25 · 279 阅读 · 0 评论 -
求有环单链表中的环长、环起点、链表长
1.判断单链表是否有环使用两个slow, fast指针从头开始扫描链表。指针slow 每次走1步,指针fast每次走2步。如果存在环,则指针slow、fast会相遇;如果不存在环,指针fast遇到NULL退出。就是所谓的追击相遇问题:2.求有环单链表的环长在环上相遇后,记录第一次相遇点为Pos,之后指针slow继续每次走1步,fast每次走2步。在下次相遇的时候fast比slow正好又多走了一圈,也就是多走的距离等于环长。设从第一次相遇到第二次相遇,设slow走了len步,则fast走了2*le转载 2021-04-13 17:09:29 · 754 阅读 · 0 评论 -
力扣146:LRU缓存机制
原题:LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,原创 2021-03-31 19:00:28 · 252 阅读 · 0 评论 -
查看linux系统端口占用命令
linux系统查看端口占用情况需要通过命令查看,哪些端口被占用,怎么开放端口等。工具/原料linux系统方法/步骤netstat -ntlp:查看当前所有tcp端口各个参数解释如下:-t : 只显示TCP端口-u : 只显示UDP端口-l : 仅显示监听套接字(能够读写与收发通讯协议(protocol)的程序)-p : 显示进程标识符和程序名称,每一个套接字/端口都属于一个程序-n : 不进行DNS轮询,显示IP(这样可以加快查询的时间)查看linux系统端口占用命令2可以用gr转载 2021-03-15 14:06:13 · 1368 阅读 · 0 评论 -
C++ vector 的push_back() 以及 内存释放
一、什么是vector?向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。二、容器特性1.顺序序列顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。2.动态数组支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。3.能够感知内存分配器的(Alloc转载 2021-03-11 21:38:13 · 5565 阅读 · 0 评论 -
懒汉式与饿汉式的区别
所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。“懒汉式”是在你真正用到的时候才去建这个单例对象:比如:有个单例对象public class Singleton{private Singleton(){}private static Singleton singleton = null; //不建立对象public static synchronized Singleton getInstance(){if(singleton == null) { //先判断原创 2021-03-11 18:20:05 · 6823 阅读 · 0 评论 -
跨服通信设计
登陆时客户端知道当前玩家所在区服(一般封装到玩家唯一UID中)当处理跨区服业务逻辑时,如加好友,发邮件等,先根据UID判断玩家是否在本区服中如果不在则向global、center等之类中转服发送消息,通过中转服再将消息发送至对方所在服。...原创 2020-12-30 17:15:21 · 389 阅读 · 0 评论 -
C++的编译过程详解
C/C++编译过程C/C++编译过程主要分为4个过程编译预处理编译、优化阶段汇编过程链接程序一、编译预处理(1)宏定义指令,如#define Name TokenString,#undef等。 对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的 Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。 这些伪指令的引原创 2020-10-10 10:37:06 · 4478 阅读 · 2 评论 -
设计模式之单例模式
一、单例模式的概念单例模式是一种对象创建型模式, 使用单例模式, 可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。二、单例模式使用场景在软件开发中,我们常常有以下需求:1、在多个线程之间,共享同一个资源或者操作同一个对象。2、 在整个程序空间使用全局变量,共享资源。3、大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。单例模式可以保证为一个类只生成唯一的实例对象,上面这些场景中就可以使用单例模式了,单例模式也是软件开发中最常使用的设计模式。三原创 2020-06-04 18:14:40 · 162 阅读 · 0 评论 -
设计模式-程序员的灵魂拷问!
一、设计模式简述设计模式是用来在一个特定的环境中解决某一个问题的方案,它是一套被反复使用、经过大量验证、经过分类设计的编码经验的总结,使用设计模式可以实现代码的可复用性、让代码更易被人理解、保证代码的质量和可靠性。它就像软件工程的基石,像一座大厦的钢架一样,要成为一个真正地编程高手,学会设计模式是必修的内功。二、设计模式的原则1、开放封闭原则类的改动是通过增加代码进行的,而不是修改源代码。2、单一职责原则类的职责要单一,对外只提供一种功能,而引起类变化的原因都应该只有一个。3、依赖倒置原则原创 2020-06-04 18:12:12 · 160 阅读 · 0 评论 -
为什么构造函数不能声明为虚函数,析构函数可以
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。。。2 虚函数...原创 2020-04-26 12:49:58 · 879 阅读 · 0 评论 -
actor、reactor与proactor模型:高性能服务器的几种模型概念
actor模型:实体之通过消息通讯,各自处理自己的数据,能够实现这并行。说白了,有点像rpc。skynet是actor模型。reactor模型:1 向事件分发器注册事件回调2 事件发生4 事件分发器调用之前注册的函数4 在回调函数中读取数据,对数据进行后续处理libevent是reactor模型。proactor模型:1 向事件分发器注册事件回调2 事件发生3 操作系统读...原创 2020-03-28 13:26:10 · 599 阅读 · 0 评论 -
C++反转单链表
// ConsoleApplication4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>using namespace std;struct linkNode{ int data; linkNode* next;};int main(){ linkNode* ln = new linkNod...原创 2020-03-28 13:26:22 · 151 阅读 · 0 评论 -
C++实现快速排序代码
// ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>template<class T>int length(T& arr){ //cout << sizeof(arr[0]) << endl; //cout <&...原创 2020-03-17 14:15:45 · 393 阅读 · 0 评论 -
C++中为什么构造函数不能定义为虚函数
关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Technique FAQ里面做过回答Avirtual call is a mechanism to get work done given partialinformation. In particular, “virtual” allows us to call afunction knowing only...原创 2020-03-17 10:05:31 · 324 阅读 · 0 评论 -
static静态变量的生命周期
静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,...原创 2020-03-09 23:12:35 · 1721 阅读 · 2 评论 -
C++编译原理
首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开。 例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换。 例如ifdef/ifndef就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理。这里面最复杂的莫过于include了,其实也很简单,就是相当于把那个对应的文...原创 2020-03-06 18:10:20 · 469 阅读 · 0 评论 -
C++在main()函数执行前,后执行了哪些操作
c++在main函数运行前,需要进行一些操作,主要是初始化系统的相关资源设置栈指针初始化static静态和global全局变量,即data段的内容将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容全局对象初始化,在main之前调用构造函数将main函数的参数,argc,argv等传递给main函数,然...原创 2020-03-06 00:23:39 · 1823 阅读 · 0 评论 -
多个客户端的python tcp server
import socketimport sysimport structimport timeimport copySEND_BUF_SIZE = 256RECV_BUF_SIZE = 256Communication_Count = 0receive_count = 0def start_tcp_server(ip, port):# create socketsock = ...原创 2020-03-05 14:28:04 · 340 阅读 · 1 评论 -
跨语言的TCP通信连接
第一次尝试跨语言的TCP连接,做了一个简单小demo,客户端部分用C++实现,服务端用python实现makefile文件:client:c++client.o g++ -g -o client c++client.oc++client.o:c++client.cpp g++ -g -c c++client.cpp客户端代码部分://c++client.cpp#include&l...原创 2020-02-26 19:13:36 · 720 阅读 · 0 评论 -
vector调用对象析构函数情况分析
$$ 调用vector clean()函数的时候如果vector里存储的是对象则会自动调用对象的析构函数,如果存储的是指针指向的对象则不会调用对象的析构。//clean源码部分for ( ; first < last; ++first) //遍历元素进行析构 destroy(&*first); *iterator是元素类型,&*iterator是元素地址,也就是一个...原创 2020-02-25 18:37:44 · 3099 阅读 · 0 评论 -
ACE常用类及对应的头文件
定时器ACE_Reactor::instance()->handle_events() #include “ace/Reactor.h”ACE_Event_Handler #include “ace/Event_Handler.h”int ACE_Event_Handler::handle_timeout(const ACE_Time_Value &cur...原创 2020-02-18 09:49:30 · 410 阅读 · 0 评论 -
c++ vector容器遍历方式
#include #include class Test{public:int a;int b;int c;Test(){a = 0;b = 0;c = 0;}}int main(){vector vecTest;for(int i = 0; i < 5; i++){Test temp;a=i;b=i+1;c=i+2;vecTest.push_...原创 2020-02-15 11:59:13 · 550 阅读 · 0 评论 -
C++模板类的异常安全
以下模板类中T的异常安全才能保证stack异常安全#include <cassert>#include <stdexcept>template <typename T>class Stack { public: // 是不是异常安全的呢 Stack() : m_data(0), m_capacity(20), m_used(0) { m_da...原创 2020-02-03 12:35:05 · 1481 阅读 · 0 评论 -
C++placementnew的使用
C++用placementnew申请空间时释放的时候要调用析构函数而不能用delete,因为不是分配在自由存储区上的,内存不是系统得到的vector申请空间用的就是placementnewclass Object { public: Object() : m_value(new int(4)) {} ~Object() {delete m_value;} private: in...原创 2020-02-03 12:21:19 · 216 阅读 · 0 评论 -
c++namespace下ADL(Argument-Dependent Lookup)查找
namespace A { struct X {}; struct Y {}; void f(int) {} void g(X) {}}namespace B {void f(int i) { f(i); //调用的是B的f}void g(A::X x) { g(x); //调用的是A下的g(X),规则决定的,根据参数类型找函数}void h(A::Y y)...原创 2020-02-03 11:49:45 · 257 阅读 · 0 评论 -
C++判断空类的方法
以下方法需要编辑器支持空基类优化,通过判断派生类和基类大小是否一致判断是不是空类:template<typename T>struct EmptyHelper : T { int group[256];};struct EmptyHelper2 { int group[256];};template <typename T>bool isEmptyCl...原创 2020-02-03 10:34:59 · 3898 阅读 · 1 评论 -
C++语言的历史
C++标准化前:C++98标准成立:协变返回类型:父类和子类函数签名是一样的,唯有返回值不一样可变型:mutable 突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。之后的C++标准库基本是由boost来提供的,10个里有7个左右...原创 2020-01-31 18:26:15 · 262 阅读 · 0 评论