- 博客(38)
- 收藏
- 关注
转载 图解NavMesh寻路中的漏斗算法
NavMesh是广泛使用的一种寻路技术,将地图中可走的部分生成连续的多边形/三角形网格,寻路在网格中进行,主要包含两步:1、根据网格的邻接信息构造图,使用A*之类的寻路算法计算出从起点到重点需要走过的多边形/三角形集合;2、使用漏斗算法/拉绳子算法,将多边形列表转换为一条最优的路店。本文主要讲一下对于三角形列表的漏斗算法原理。诸位读者如果搜索过网络,会发现有一年GDC有人讲了这个算法...
2019-08-10 20:35:00 847
转载 聊聊我对python的感受
工作中主要是在写python2,把python作为用户逻辑的载体的,一般是C++写好底层,导出成python模块使用,或者是可执行程序带起来一个python虚拟机,把函数注入进去,然后加载python代码执行。我接触的这部分python,没有太多的框架,几乎不使用基本数据结构之外的标准库,因为很多东西都是C++封装好给python的,性能比纯python好很多。因此下面的文字也主要围绕着...
2018-12-09 14:16:00 184
转载 C++ allocator 自定义指南
闲话 昨天培神在群里抱怨说自定义allocator遇到了奇怪的问题,然后选择了pmr,我表示很理解。allocator这个东西,出生时就伴随着设计错误和无用的抽象,C++03-14糊了这么久,甚至还加了新feature来兼容旧翔和糊新翔,结果C++17最终还是另立门派搞了个pmr。 简单说,虽然allocator的concept说了很多东西,也有一些周边的concept比如alloc...
2018-06-19 11:31:00 980
转载 C++ coroutine-ts 怎么用-Part 3 从generator看co_yield怎么用
clang和MSVC的最新实现已经提供了试验性的协程实现,想要试用的话,clang需要开启-fcoroutins-ts -stdlib=libc++两个开关,而MSVC需要开启/await开关。 我们从一个简单的generator来看编译器做了什么: #include <experimental/generator>#include <cstdio>na...
2018-04-18 21:17:00 730
转载 C++ coroutine-ts 怎么用-Part 2 coroutine有什么用
上一篇说了coroutine的本质是什么,就是resumable function,那么一个函数有了suspend和resume功能之后,会打开什么样的新世界大门呢?随便举几个例子。 函数每次被唤醒,就丢出一个值,然后暂停——这是generator 函数启动一个IO操作,注册IO操作完成时唤醒自己,然后暂停——这是async-await 函数开启一个管道,暂停,另一个...
2018-04-12 17:34:00 286
转载 C++ coroutine-ts 怎么用-Part 1 什么是coroutine
什么是coroutine 什么是coroutine?接触过的脑子里肯定会蹦出来很多词:async-await,generator,channel,yield,高并发,甚至goroutine。其实,这些都是coroutine的外部表象,coroutine的本质是什么?上古时期的计算机科学家们早就给出了概念,coroutine就是可以中断并恢复执行的subroutine,什么是subr...
2018-04-10 17:38:00 620
转载 三张图解释为什么 std::shared_ptr 需要保存 weak_count
更正:图里面的shared_core在实现里面一般叫ref_count_base,是一个多态的东西 转载于:https://www.cnblogs.com/pointer-smq/p/8722164.html
2018-04-05 13:04:00 692
转载 一个实验性的C++编译期正则表达式parser
这个东西主要是用来在编译期把正则表达式字符串字面量处理成正则表达式语法树(表达式模板),然后运行期可以直接使用这棵语法树来匹配文字了,避免了运行期编译正则表达式的性能负担(这里真的是critical的地方吗?),并且类型安全,语法有错的话根本通不过编译。 因为是实验性的,只支持三个基本元素:连接,或,克林闭包,不支持括号,我也不是很想继续写下去(已经写下去了,支持90%的ECMA Sc...
2017-09-23 22:57:00 231
转载 整理 C++ 中 Allocator 的(几乎)所有细节 1
Allocator(概念)是对访问、寻址、分配、释放、构造和析构策略的封装。是一个满足特定要求的类。标准库中需要分配释放存储空间的容器都需要一个Allocator,除了std::array。必选成员Allocator 需要满足的条件有很多,但是大部分都是可选的,只有几个必须存在的成员。value_type: 要分配空间的类型allocate(n): 分配方法dea...
2017-09-14 19:47:00 1214
转载 浅谈std::bind的实现
bind这个东西争议很多,用起来很迷,而且不利于编译优化,很多人都推荐用lambda而非bind。简单说,bind就是通过库抽象实现了lambda里需要写进语言标准的东西,变量捕获,参数绑定,延迟求值等。但是以此带来的缺陷就是,虽然bind生成的可调用对象的结构是编译期确定的,但是它的值,尤其是被调用的函数,全部是在运行期指定的,并且可调用对象也只是一个普通的类,因此很难进行优化。除此之...
2017-07-22 12:47:00 653
转载 整理C++常用整数运算的所有细节
前段时间写我的安全整数类checked,顺便就通读了标准中关于整数运算的部分,还发现了不少坑,以及自己没有了解的细节,这里就总结一下。要注意的是,C和C++在这部分的逻辑不相同第一步,单操作数的类型提升(integral promotion)对于C++中的所有字符类型,char,signed char,unsigned char,wchar_t,char16_t,char32...
2017-05-06 16:38:00 275
转载 TinyCMips - 1 C语言子集到Mips子集编译器项目开坑
TinyCMips是我最近在写的一个编译器,就像标题所说,是一个C语言子集到Mips子集的编译器,开这个坑的目的大概是这样的 就是为了写一个完整的编译器 准备大三编译原理课拿来复用 大二他们上计组课的可以拿来将C代码编译到课程用的Mips CPU 满足个人兴趣 充实简历 之所以选择C语言并且是子集,首先是因为C标准十分庞大,其次是因为这个编译器是尝试给...
2017-01-26 22:23:00 274
转载 C++坑点集合 - 2 严格的Multipass Guarantee
之前写了一个char32_iterator,简单说就是封装一个string::const_iterator,在operator*的时候将它引用的utf-8序列转为utf-32编码的单个字符返回——这看上去很简单。平时各位在编程的过程中一定会遇到类似的需求:实现一个惰性的transform,在一个容器的每一个元素上应用一个转换函数,但不是立即应用,而是等到使用它的时候即时转换。这听起来就像...
2017-01-24 23:50:00 113
转载 2017,不能再咸鱼了
2017到了,回顾一下2016,基本上可以说是咸鱼的一年,没啥长进,没学啥新东西,看看2016的目标看编译原理——没怎么看看算法导论——没看填坑——没填啥坑养成良好的生活习惯——没啥好习惯继续做软粉——动摇了2017年新的目标是什么呢把TinyCMips写出来把类型和程序设计语言这本书看了学一下MIT的PL方向的公开课学英语找一家优...
2017-01-06 11:06:00 97
转载 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针。对于简单类型,这样声明并不会对代码产生多大的阅读障碍,而对于复杂的声明,比如标准库的signal函数签名,void (*signal( int sig, void (*handler) (int))) (int),这是什么?一眼看不出来吧,...
2016-08-16 23:31:00 86
转载 独自handle一个数据库大程有感
这学期数据库课程,最后的大程是写一个MiniSQL的数据库实现,要求很简单,建删表,建删单值索引,支持主键和unique定义,支持最简单的select,只要支持3个类型:int,float,char(0~255)。最开始,考虑到数据库的运行时确定类型的特点,选择了运行时强大的C#,还能顺便集成进Linq。但是一周后发现C#操作对象二进制结构的能力几乎为0,在写BufferManager的...
2016-07-07 22:58:00 150
转载 Async Programming - 1 async-await 糖的本质(2)
上一篇讲了这么多,其实说的就是一个事,return会被编译器重写成SetResult,所以如果我们的异步函数返回的是一个Task<int>,代码就要改成这样: using System;using System.Runtime.CompilerServices;using System.Threading.Tasks;namespace StateMachi...
2016-05-13 16:16:00 111
转载 Async Programming - 1 async-await 糖的本质(1)
这一个系列的文章主要来讲 C# 中的语言特性 async-await 在语言层面的本质,我们都知道 await 是编译器进行了一个 rewrite,然而这个 rewrite 并不是直接 rewrite 成其他没有原生支持 await 的语言的 lambda 回调的形式,而是整个对方法进行了重写,下面就让我们来从最简单的方法,一步一步剖析 await 糖的工作机制。 一个 async 方...
2016-05-06 15:45:00 115
转载 源码阅读笔记 - 3 std::string 与 Short String Optimization
众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的。然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大小在运行时确定,很自由。此外,栈空间比堆空间有限,前者只有几MB,而后者基本上就是你系统内存的大小。正因为这样,我们想组合两者的优势,既要享受堆空间的自由,又想要在数组较小的时候使用栈空...
2016-04-30 21:57:00 281
转载 C++坑点集合 - 1 隐式调用和默认实现的构造函数的坑
C++是一个编译器会替你在背后做很多事情的语言,包括模板实例化,按需要创造隐式的构造函数,默认构造你没有显式构造的成员,按需进行隐式转换和饮食构造等等,如果没有彻底了解清楚,就容易被这些编译器背后做好的事情坑到,这个系列文章就来总结我在写C++时遇到的各种坑。 所谓隐式调用和默认实现的构造函数,当你写一个赋值语句的时候,编译器会首先检查两个类型又没有直接实现的赋值函数,然后检查赋...
2016-03-20 14:13:00 130
转载 源码阅读笔记 - 2 std::vector (2) 关于Allocator Aware Container特性
所有的STL容器,都保存一个或默认,或由用户提供的allocator的实例,用来提供对象内存分配和构造的方法(除了std::array),这样的容器,被称作Allocator Aware Container。早期的STL,设计的尚不完善,各种实现之间不能相互兼容,这一点在侯捷的《STL源码剖析》中有提到:有些STL的实现无法兼容标准的allocator实现,因为他们使用了更为复杂的二级配...
2016-03-06 14:40:00 238
转载 源码阅读笔记 - 2 std::vector (1)
vector的源码真是太长了,今天用了一个下午和一个晚上看和注释了前面的一千行左右p.s.博客园的代码高亮真是太垃圾, 如果想要阅读带注释的源码,推荐粘贴到VS2015里,然后按ctrl+z取消自动格式化,用我格式化好的样子,并在最前面#include <vector>和using namespace std,这样就能带高亮的看我加了注释的代码了花了不短的时间弄明白了...
2016-03-05 22:14:00 418
转载 Lambda演算 - 简述Y组合子的作用
Y组合子:\f.(\x.f(xx))(\x.f(xx)),接受一个函数,返回一个高阶函数Y组合子用于生成匿名递归函数。什么叫匿名递归函数,考虑以下C语言递归函数int sum(int n){ return n == 0 ? 0 : n + sum(n-1);}这个函数在内部递归调用了自身,调用自身需要函数本体的名字,这个函数叫sum,sum内部用名字su...
2016-02-29 23:16:00 584
转载 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块后(下面)用...
2016-02-22 21:08:00 153
转载 Win32API界面库 - Project wheels 工程基础部分完成
离上次发博文过去了好久,先是要忙一个机器人的项目,然后就是部门的事情和考试周复习,然后就到了考试周,趁着复习的间隙,拾起了寒假时候抄的界面库,修掉了从前的bug。bug1 控件显示问题当初抄这个库的时候就对排版部分的代码一头雾水,借着这次调bug,稍微理清了排版部分代码的意图。界面的排版是动态进行的,用户用placement命名空间的各种排版元素构造出整个排版的结构布局,然后调用...
2016-01-18 21:17:00 194
转载 C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数、所有浮点数、字符串,分别将这三种“大类”的数据分配到对应的Converter上。为此实现了一些方便的类型运算工厂,比如TypeEqFact,同于生成比较两个类型是否相等的谓词,PredOrFact,用于生成将若干个谓词采用“或”运算生成的新谓词。template<class...
2015-11-26 22:46:00 99
转载 C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法
C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供。开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别实现接受整数和浮点数的构造函数,构造函数中初始化类内保存数据的容器,所有整数的构造方法相同,所有浮点数的构造方法也相同,现在的目标是,找到一个机制,能尽可能少的实现代码,争取做到所有整数实...
2015-11-13 22:05:00 75
转载 挖的坑太多了,理一理
2016年到了,写下新年愿望的时候,突然想到了2015年时写的5条愿望:做学霸自学完C++,造轮子组建个人办公网络抽时间看C#,Java,Python笔记本硬件升级回想那之前几周开了这么多坑,自己也应该冷静一下,找一个清晰的目标了,2016年安排如下:看编译原理看算法导论填坑养成良好的生活习惯继续做软粉新的一年要有新的安排,...
2015-10-31 14:42:00 92
转载 编译原理 - 1 手撸状态机词法分析器
感谢vczh轮子叔的坑了的教程,我的编译原理第一次入了个门,词法分析写完了,今后可以看看书继续往下学了。http://www.cppblog.com/vczh/archive/2014/03/02/206014.html词法分析,就是对于一段代码,把他们分割成一个个的token,同时记录他们的行列号,丢掉不必要的信息,这个词法分析器很简单,简单的状态机就能胜任,用正则就没有自己造...
2015-10-23 14:49:00 288
转载 用C#开发了四天的UWP应用有感
第一个就是异步方法,async-await,所谓async关键字,并没有什么实际上的语法意义,只是写在函数签名的位置让编译器方便进行查找以及静态检查,并且提醒程序员这是一个异步方法而已。至于await,这是一个运算符,作为一个语法糖,编译器在背后替你展开了所有的代码。略去了这部分细节,可以像写同步调用一样写异步调用。await一个表达式,空值列会在执行到这个表达式时立即返回,同时这个...
2015-10-04 20:49:00 330
转载 CPS冥想 - 2 手撸控制流
原博客链接:http://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-part-two-handwaving-about-control-flow.aspx上一节说到:我们可以通过跟踪不同的continuation并决定下一步执行哪个来构造任意复杂的控制...
2015-09-18 11:45:00 240
转载 CPS冥想 - 1 重新审视CPS
这篇文章是在阅读Eric Lippert大神的MSDN Blog文章时同步写成的,其中主要是各种翻译,同时还混杂自己阅读文章的笔记和感想。原博文地址http://blogs.msdn.com/b/ericlippert/archive/2010/10/21/continuation-passing-style-revisited-part-one.aspxCPS是Cont...
2015-09-17 23:51:00 160
转载 把自己主要在做的几个工程都传到了GitHub上
GitHub链接https://github.com/MichaelSuen-thePointer里面有4个项目,一个是我的C大程大作业,一个3600+行的字典程序,已经弃坑不再更新还有一个叫wheels的,是抄vczh轮子叔的一个Win32界面库,正在抄,还没抄完,抄完之后会开一个分支做一下修改还有一个toys,里面是各种实验型项目,包括之前那个模板元编程的代码。...
2015-09-11 11:59:00 77
转载 牢骚 - 你代码写得丑,又不肯用好一点的IDE,这让我很为难啊。
又有人问我代码错误,发过来就是一篇巨丑无比的代码,先不说左大括号转行还和代码写在同一行的谭浩强风格,你这狗啃的一样的缩进是闹哪样!粘进VS2015里面,自动格式化,瞬间赏心悦目,编译错误出了5行,我直接粘给他,他说这些都没有错啊,然后发给了我一个VC6编译错误的截图,错误足是VS2015的三倍多,我定睛一看,MB,少写了一个右大括号,怪不得这么多莫名其妙的错,改过来之后,又是未初始化变量...
2015-09-03 20:31:00 80
转载 C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
本来想把scanr,foldr什么的都写了的,一想太麻烦了,就算了,模板元编程差不多也该结束了,离开学还有10天,之前几天部门还要纳新什么的,写不了几天代码了,所以赶紧把这个结束掉,明天继续抄轮子叔的Win32库去。逻辑结构和递归说白了就是做了一个If,一个For_N,If就和Excel里的If一样,For_N是把一个模板结构迭代N遍,为了所谓的方便,把If做成了宏,写起来还挺有意思...
2015-09-03 20:14:00 78
转载 C++模板元编程 - 2 模仿haskell的列表以及相关操作
这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D>>>的设计要好看不少。List有一个很巧妙的继承,只有那么做才能使用类似于List<>::Rest的写法,直接定义成template<typename T,...
2015-09-02 21:19:00 156
转载 C++模板元编程 - 1 基本数据类型和运算
这是博客开通前几天做的,C++的模板没办法存方便的浮点数,算了。基本类型的设计参考了vczh轮子叔模仿boost的MPL的设计。话说template和typename写多了真是无限烦人啊,不得已定义了几个宏,然后运算的定义也是用宏批量生成的。 1 template<typename TPOD, TPOD V> 2 struct PODType 3 {...
2015-09-02 18:24:00 152
转载 新博客开篇
从去年暑假重拾编程到现在,自己也写了很多东西,造了一点轮子了,觉得有必要在这里分享一下自己一步一步的成果,不过说是分享,我觉得这里多半会变成我一个人自言自语的地方,毕竟大神这么多,不会在意我这种菜鸟,对吧。我将主要在这里放一些自己造轮子的成果和一些感想,代码总会是比文字要多的,这里也不会放一些类似教程的东西,毕竟东西自学之后再去看别人的总比直接听别人讲的要印象深刻嘛。话说自己新一...
2015-09-02 17:43:00 79
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人