cpp
__xa__
.
展开
-
虚表指针在哪里
虚表指针群里有人问。就写了从最简单的类开始, 后面有单继承和多继承虚表指针的不同代码在32环境下:先写结论: 虚表指针在构造函数与析构中赋值(下面反汇编证明), 赋值: *this = 虚表指针(即首个成员) 虚表指针指向的是一个数组,存放虚函数,虚函数按一般声明先后排序. 这个数组一般在 .rdata 或 .data 每个父类都会在构造,析构中设置自己的虚表,下面继承中会写 * 为什么要在构造...原创 2021-09-08 18:27:01 · 917 阅读 · 0 评论 -
完成端口服务器
一个可以直接用的最基本的iocp服务器在每个TcpConn对象中可以自己增加各种回调接口至于心跳检测 可以用带外数据oob在客户端来实现;1.这个服务器没有使用acceptex2.再wsarecv的时候并没有直接存放缓冲区. 而是在 GetQueuedCompletionStatus 返回再去recv数据 这样做的目的是为了减少内存的使用, 让wsarecv仅仅产生通知, 类似epoll, 因此GetQueuedCompletionStatus返回0也是正常的 代码里并...原创 2021-03-24 22:05:12 · 130 阅读 · 0 评论 -
原子的比较 compare_exchange_strong
包含原子操作的链接:InterlockedCompareExchange 模拟callonce内存序 memory_order现在假设有一个套接字状态的原子变量 atomic_int socketState;在一个设计不良的多线程环境中, N个线程都会修改此状态,但只能执行一次;enum EnumSocketState { SocketStateNone = 0 , SocketStateAlive = 1, SocketStateClosed = 2};std::atom.原创 2021-03-03 14:09:54 · 2478 阅读 · 0 评论 -
内存序 memory_order consume acquire release
记录有一个项目里乱用 atomic 内存序 , 全部用了memory_order_relaxed, 都不知道是怎么测过的.memory_order_acquire - release :1.至少2个线程需要对这个变量操作2.假设A线程release , B线程acquire , 此时将进行同步, B线程acquire 确保是A线程release的值是最新的.3.[ 没有特殊需求,这点就忽略算了 ] 还有个副作用, B线程acuqire后, A线程release之前的...原创 2021-03-03 11:29:01 · 364 阅读 · 0 评论 -
日志 多线程 自动刷新 _fwrite_nolock
只启动了一个线程 用来写日志.性能方面没问题, 支持多线程写入.每3秒自动查看缓冲区是否有数据,有就写入 .或者外部N个线程同时写满一块缓冲区,进行写入.主要是减少少量数据[几个字节]就写入一次的次数.写入方面可以用 WriteFile 或者_fwrite_nolock. 如果用用WriteFile 还可以使用APC来通知,目前没此需求另外,写入出错方面,只是简单的打印,可自行修改的完善一些如果没有别的需求,直接使用Log类即可Log : start() 启动, s...原创 2020-07-28 23:29:30 · 345 阅读 · 0 评论 -
win32 定时器 CreateThreadpoolTimer CreateTimerQueueTimer
linux 下可以使用timerfd_create 一系列函数win32下CreateThreadpoolTimer 或者CreateTimerQueueTimer 都可以用进程默认的线程池来使用回调对于DeleteTimerQueueTimer 以及DeleteTimerQueueEx 最后一个参数需要注意一下如果是 INVALID_HANDLE_VALUE : callback如果正在调用则等待回调完成如果是 NULL : callback 如果正在调用,则G...原创 2020-07-27 23:33:24 · 1315 阅读 · 0 评论 -
安全随机数
随机数出问题了, 分装了一个#include <Wincrypt.h>#include <Realtimeapiset.h>#include <tchar.h>#pragma comment(lib,"Advapi32.lib")class CryptRandom{ CRITICAL_SECTION __lock; HCRYP...原创 2020-03-20 21:50:41 · 893 阅读 · 0 评论 -
epoll Reactor 与 iocp 模型
epoll reactor : 能收了告知我 !iocp : 最多给我收wsabuf.len个字节, 收完告诉我!原创 2019-11-06 23:25:01 · 255 阅读 · 0 评论 -
atomic 内存序
提高性能的一种方式atomic 替换mutex内存序跟原子操作本身并不冲突, 不论用那种内存序该原子还是原子操作atomic内存序: 就是来指定顺序的例子:注 : 像类似 memory_order_relaxed 都是以函数为单位来重新排执行指令的 [这个注释后面再来看好了]#include <atomic>atomic<int> a (0);...原创 2019-11-01 03:12:06 · 914 阅读 · 0 评论 -
c++ atomic 替换锁
有些文不对题了;最近搞线程池并发过程中突然想起来用 原子类型 来替换一些mutex, rwlock, cond这些东西;比如一个reactor 的epoll+线程池[ 例如4个 ], 在发送数据时为了保证tcp socket的数据顺序,必须加锁处理 [这种模型不容易控制, 实际工程中别用, 对于 socket 还是有一个线程来处理最简单也避免竞争问题].然后我发现了个好东西;...原创 2019-10-31 01:04:17 · 902 阅读 · 0 评论 -
花花公子 243线SLOT
另一种243线的SLOT游戏3*5的数组具体思路, 每个数组元素根据14个图案的概率去随机获取,如果无法获取到则先赋值-1, 最后把-1的元素全部替换成无法赢钱的图案,这些图案中不能包含WILD和SCATTER,我这的代码里概率设置的很低#include <random>#define RATELEN 15#define ROW 3#define LINE...原创 2019-10-11 01:10:19 · 956 阅读 · 0 评论 -
花花公子
一个3*5的矩阵至少连续3个列都出现同一个卡牌算赢, 无视位置比如:1 0 0 0 00 1 0 0 00 0 1 0 0思路: 先计算所有不算位置 , 而能赢的全排列数据#define Row 3#define Line 5int main(int argc, char* argv[]){ using namespace std; ...原创 2019-09-26 01:26:39 · 1656 阅读 · 0 评论 -
心跳检测,用oob实现
用select和msg_oob实现 心跳;对于oob数据 ,默认情况下 [ 不开OOBINLINE]:他不在接受缓冲区, 而在另1个缓冲区中,这个缓冲区只有一个字节,因此不论客户端以MSB_OOB发送N个字节的数据, 只有最后一个字节是OOB数据, 同理,因为只有一个字节的缓冲区,如果连续2次发送msg_oob , 那么后一次将覆盖前一次, 最后OOB是tcp头中的一个URG指...原创 2019-06-28 17:54:14 · 1162 阅读 · 0 评论 -
关于AcceptEx
最基础的IOCP例子, 没有使用扩展函数AcceptEx: IOCP模型* 关于iocp的核心就一点:GetQueuedCompletionStatus 将携带返回2个重要的参数, 一个lpCompletionKey, 一个lpOverlapped.lpCompletionKey : 是 CreateIoCompletionPort((HANDLE)clientSocket , ...原创 2019-09-20 00:21:19 · 1001 阅读 · 0 评论 -
多线程记录二进制流文件
一个生产者多消费者的应用 , 代码里目前就先简单用了单生成单消费,每一局麻将都需要记录:每一次的发牌,抓牌,出牌 ,吃碰杠胡听;把所有的牌 序列化成二进制存入文件每一局麻将生成一个key , 可随意自己组合下面代码思路仅供参考, 还未测试过; 可修改成多线程日志主线程唯一需要在开始的时候调用一次 start , 记录用push;2种模式可选, 一种不关闭文件han...原创 2019-09-07 16:28:57 · 174 阅读 · 0 评论 -
c++ 胡牌 听牌
生成一张N维的图去分析, 比较容易一些这个是2人麻将, 4人麻将改几个数值就可以用了;判断胡牌的思路:比如 :1~9万, 0x01 ~ 0x09 ;1~9筒 , 0x11~0x19;1~9条 , 0x21~ 0x29;东南西北中发白 : 0x31 ~ 0x39花牌 : 0x41 ~ 0x48;弄一个 arr[4][10] 的数组, 做一个牌型的图出来...原创 2019-08-31 16:44:46 · 317 阅读 · 0 评论 -
老虎机 抽奖 概率
适用于任何需要概率的游戏; 没几行代码;主要是生成一个概率数组 , 接下去每次随机一个数, 去这个数组里选取对应的值#include <random>//从概率数组中 拿个索引, 对应概率数组int get_rate_index(long double * arr,int len ,long double rand_num){ for(int i = 0 ...原创 2019-08-22 23:37:57 · 3116 阅读 · 0 评论 -
从数组中任取N个数重新生成全排列N维数组
代码只给出一个思路, 都写注释里了, 可以根据需求生成N维数组的各种位置的全排列数组;比如 [1,2,3] 来生成一个3*3的全排列数组;下面生成了一个 3* 3的数组 , 用于各种位置的变化,如果需要更多维度的不同位置的全排列数组, 继续增加 do while 来全排列即可;#include <iostream>#include <algor...原创 2019-08-22 22:35:35 · 367 阅读 · 0 评论 -
另人厌烦的线程安全单例以及不要使用双检测
群里热烈的讨论了线程安全的单例;一路从volitile扯到汇编,从代码到论文,真是够了;首先volitile 跟多线程没直接的关系,或许有些特定情况下会用到;至于spincout之类的实现,内部使用了volitile,这类就不多说了,有兴趣的可以自己看实现;千万别使用下面代码 ,不要使用双检测,不要使用双检测,不要使用双检测:static Singleton* Sin...原创 2019-06-17 01:26:07 · 177 阅读 · 0 评论 -
函数模版 特化 模版指针
函数特化在下面做了大量的补充;类模版 函数模版与类模版的一个不同点是:类模版如 :template <typename T> class A{}; 那么 A<int> 或 A<double> 是一个类; 即A是模版,A后面带着<XXX>则是一个类;函数模版如:template <typename T>T co...原创 2018-10-05 18:01:51 · 800 阅读 · 0 评论 -
定位new的析构
#include <new>#include <string>const int BUFF_SIZE = 512;using namespace std;class testing{ string words; int num;public: testing(const string &s = "testing",int n =0...原创 2018-09-27 16:02:49 · 240 阅读 · 0 评论 -
可变参数模版
//模版头template < typename ... Args> //Args 是模版参数包void print( Args ... args) //args 是函数参数包{ print(args...) //展开函数参数包 }/* 以上是一个可变参数模版的基本写法; 有3个点在 Args与 args 前; 意...原创 2018-10-12 15:02:08 · 227 阅读 · 0 评论 -
c++ lambda bind 参数绑定 functional
/* lambda: [捕获列表](函数列表){ body } , 其中函数参数列表可以省略如果没参数的话. 捕获列表: 在当前作用域引用或者拷贝一份变量; 引用: [&] , 在作用域里的所有变量全可以引用 复制: [=] , 所有变量全copy一份 混合: [&, a,b,c] 除了a,b,c变量复制...原创 2018-10-14 22:49:05 · 670 阅读 · 0 评论 -
c++迭代器
把迭代器理解为广义上的指针,换句话就是可能封装了一个指针,也可能就是一个操作类似指针的一个对象;迭代器的作用是可以独立于标准库的算法:比方说模版的作用是把类型抽离出来,只专注算法. 迭代器的作用是把容器抽离出来 , 例如://输出的模版函数/*print 不需要知道容器类型, 只需要迭代器能递增,以及获取值即可;模版的作用是把类型抽离出来.迭代器的作用是把某种类型容器抽离...原创 2018-10-12 22:01:05 · 387 阅读 · 0 评论 -
cpp隐式向上类型转换
一个例子对父类指针指向子类对象的扩展class A{ public:};class C{ public:};class Child : public A , public C{public: A& getA(){ return *this; // 也可以(A&)*this; } C& getC(){ ...原创 2018-09-28 14:40:51 · 361 阅读 · 0 评论 -
cpp父类指针指向子类的问题以及多继承中的指针
父类指针指向子类对象 : 父类指针指向子类对象中的父类对象;一个多继承问题: class Base{};class A : public Base{};class B : public Base{};class C : public A , public B{};int main(int ar...原创 2018-09-29 14:49:29 · 886 阅读 · 0 评论 -
模版与头文件
//test.htemplate<class T> class A { public: void bb(); //声明 }; //test.cpp#include”test.h” template<class T> void A<T>::bb() //实现{ } //main.cpp#include”test.h” in...原创 2018-09-29 17:57:33 · 342 阅读 · 0 评论 -
rtti例子
关于dynamic_cast 的使用:class GrandFather{private: int hold;public: GrandFather(int h = 0) :hold(h){} virtual void speak() const { cout << "GrandFather\'s speaking" << e...原创 2018-10-08 19:07:20 · 123 阅读 · 0 评论 -
置尾返回类型 decltype auto
/* auto : 由编译器推断类型 decltype (表达式) -> 推断出类型 , 比如: decltype(1+2) -> int; decltype 需要注意 :表达式能明确类型才能推断出来, 如果是模板参数则无法推断,因为 模板类型参数总是在实例化后才能确定. ...原创 2018-10-15 18:34:12 · 295 阅读 · 0 评论 -
move 右值 折叠引用
引用是啥: int &r; //error . 需要定义初始化 int &r = 变量; //ok 引用相当于一个常指针 : int &r == int *const r; 右值简介:一定要区分右值引用变量(左值)与右值(临时) int i = 10; int& r = i; //ok ...原创 2018-10-15 20:00:41 · 315 阅读 · 0 评论 -
模板参数 右值引用 折叠引用 forward 转发
右值 , 折叠引用详细说明:move 右值 折叠引用右值(严格来说是右值变量)只能绑定到一个匿名的临时对象1. 先简介 右值 与 模板参数的关系 右值简介: int i = 10; int& r = i; //ok int&& rr = i ; //error . 右值只能绑定字面量或临时对象; int&...原创 2018-10-17 03:42:41 · 459 阅读 · 1 评论 -
右值引用一句话解释
一句话解释: 右值引用只能绑定到一个无名的临时对象详细解释: 右值 moveint a = 0;int &lr = a; // okint &&rr = a ; //error;int &&rr = lr; //errorint &&rr = 10; //okint &&rr2 = rr; //e...原创 2018-10-17 01:03:31 · 139 阅读 · 0 评论 -
标准库一些常用的东西
1.以下的一些东西无法用以关联容器,set/map .. 这些根据二叉树的容器在插入时已根据 const key 排序了,因此通用排序的算法已无法再次修改;2.下面代码中使用了很多函数对象(like function) / 可调用的对象 : 无非是 函数指针, 重载operator()( args ) 函数的class/struct , std::bind , lambda 这四类...原创 2019-01-11 13:00:02 · 183 阅读 · 0 评论 -
reinterpret_cast的错误示范
记录一次 reinterpret_cast 的错误示范 bool a = true; *reinterpret_cast<char*>(&a) = -1; cout << sizeof(a) << "," << a << endl; if(a == true){ cout &l...原创 2019-04-27 00:42:44 · 815 阅读 · 0 评论 -
集合类的错误使用
最近在回答一些群组里的问题,记录一下std::set / map 是有序的,通过第2个函数[对象]来进行比较,然后插入;因此在insert/find时都会调用比较函数.一个错误例子:struct Comp{ template <typename T> bool operator()(const T & a, const T& b){ ...原创 2019-04-29 17:54:43 · 226 阅读 · 0 评论 -
因多线程引起的new关键字说明
在线程安全单例以及不要使用双检测说了new产了3个步骤;分配内存 调用构造函数 把地址返回2 和 3 由编译器来完成;有的小伙伴不太懂,说明一下;先给结论:使用关键字(new,delete)和直接调用全局函数(operator new / delete ) 不一样的 , 编译器会做额外的事new关键字调用 先::operator new 分配空间 - >...原创 2019-06-19 01:05:10 · 932 阅读 · 0 评论 -
类模版 具体化 特化 部分特化 友元
函数模版 特化提前说明一下:写类模版时把 <类型参数 >与 类名 看成一个整体 , 比较好理解;比如 stack<int> 是一个类, stack<double> 是另一个类. 那么stack 呢?? 是一个用于生成类的模版,即类模版是一个类的蓝图, 涉及到具体的类(stack<int>)则由编译器给我们生成;如果看这些东西比...原创 2018-10-03 13:36:50 · 280 阅读 · 0 评论