随笔分类 -  C++

1 2 下一页
C++20协程解糖 - 动手实现协程3 - generator和co_yield
摘要:本期实现的功能很简单,协程的重头都在co_await和异步操作上,generator本身是一个很轻的东西如果你看到这行文字,说明这篇文章被无耻的盗用了(或者你正在选中文字),请前往 cnblogs.com/pointer-smq 支持原作者,谢谢基本结构generator和future/promise的模式的区别在于,future/promise的核心数据存在堆分配的shared_state里,协... 阅读全文
posted @ 2020-05-24 13:01 PointerSMQ 阅读(1184) 评论(0) 推荐(1)
C++20协程解糖 - 动手实现协程2 - 实现co_await和co_return
摘要:在开始之前,我们先修复上一篇文章中的一个bug,SharedState::add_finish_callback中post_all_callbacks应当提前判断settled,否则会在未设置结果的情况下添加callback,callback也会被立即posttemplateclass SharedState : public SharedStateBase { // ... // p... 阅读全文
posted @ 2020-05-22 23:19 PointerSMQ 阅读(1229) 评论(0) 推荐(1)
C++20协程解糖 - 动手实现协程1 - Future和Promise
摘要:std::future和promise在C++20里面没法直接用的唯一原因就是不支持then,虽然MSVC有一个弱智版开线程阻塞实现的future.then,能then了但不保序,而且libstdc++也用不了。folly之类的库有靠谱的实现,但是功能太齐全太复杂,不适合新手学习。因此我们先从弱智版future promise schedular开始,从源头讲解如何实现协程相关设施。如果你看到这行... 阅读全文
posted @ 2020-05-16 14:36 PointerSMQ 阅读(1429) 评论(0) 推荐(1)
C++20协程解糖 - 调用流程和一些细节
摘要:本文的前置知识:你至少要知道其他语言的无栈协程是如何实现的,如C#,python。lua不算,lua实际上是有栈协程(对lua虚拟机有栈) 阅读全文
posted @ 2020-05-10 15:38 PointerSMQ 阅读(1147) 评论(0) 推荐(0)
C++20协程解糖 - 细节简化版
摘要:我已经花了10分钟完全了解了C++20协程!这篇文章仅展示简化版的控制流解糖,不展示coroutine_handle和各种awaitable的内部实现 阅读全文
posted @ 2020-05-09 14:50 PointerSMQ 阅读(1149) 评论(0) 推荐(1)
C++ allocator 自定义指南
摘要:闲话 昨天培神在群里抱怨说自定义allocator遇到了奇怪的问题,然后选择了pmr,我表示很理解。allocator这个东西,出生时就伴随着设计错误和无用的抽象,C++03-14糊了这么久,甚至还加了新feature来兼容旧翔和糊新翔,结果C++17最终还是另立门派搞了个pmr。 简单说,虽然allocator的concept说了很多东西,也有一些周边的concept比如allocator ... 阅读全文
posted @ 2018-06-19 11:31 PointerSMQ 阅读(1982) 评论(1) 推荐(2)
C++ coroutine-ts 怎么用-Part 3 从generator看co_yield怎么用
摘要:clang和MSVC的最新实现已经提供了试验性的协程实现,想要试用的话,clang需要开启-fcoroutins-ts -stdlib=libc++两个开关,而MSVC需要开启/await开关。 我们从一个简单的generator来看编译器做了什么: #include #include namespace stdexp = std::experimental;stdexp::generator... 阅读全文
posted @ 2018-04-18 21:17 PointerSMQ 阅读(787) 评论(0) 推荐(0)
C++ coroutine-ts 怎么用-Part 2 coroutine有什么用
摘要:上一篇说了coroutine的本质是什么,就是resumable function,那么一个函数有了suspend和resume功能之后,会打开什么样的新世界大门呢?随便举几个例子。 函数每次被唤醒,就丢出一个值,然后暂停——这是generator 函数启动一个IO操作,注册IO操作完成时唤醒自己,然后暂停——这是async-await 函数开启一个管道,暂停,另一个函数往管道... 阅读全文
posted @ 2018-04-12 17:34 PointerSMQ 阅读(593) 评论(2) 推荐(2)
C++ coroutine-ts 怎么用-Part 1 什么是coroutine
摘要:什么是coroutine 什么是coroutine?接触过的脑子里肯定会蹦出来很多词:async-await,generator,channel,yield,高并发,甚至goroutine。其实,这些都是coroutine的外部表象,coroutine的本质是什么?上古时期的计算机科学家们早就给出了概念,coroutine就是可以中断并恢复执行的subroutine,什么是subroutin... 阅读全文
posted @ 2018-04-10 17:38 PointerSMQ 阅读(1152) 评论(2) 推荐(0)
三张图解释为什么 std::shared_ptr 需要保存 weak_count
摘要:更正:图里面的shared_core在实现里面一般叫ref_count_base,是一个多态的东西 阅读全文
posted @ 2018-04-05 13:04 PointerSMQ 阅读(723) 评论(0) 推荐(0)
一个实验性的C++编译期正则表达式parser
摘要:这个东西主要是用来在编译期把正则表达式字符串字面量处理成正则表达式语法树(表达式模板),然后运行期可以直接使用这棵语法树来匹配文字了,避免了运行期编译正则表达式的性能负担(这里真的是critical的地方吗?),并且类型安全,语法有错的话根本通不过编译。 因为是实验性的,只支持三个基本元素:连接,或,克林闭包,不支持括号,我也不是很想继续写下去(已经写下去了,支持90%的ECMA Script正... 阅读全文
posted @ 2017-09-23 22:57 PointerSMQ 阅读(379) 评论(0) 推荐(2)
整理 C++ 中 Allocator 的(几乎)所有细节 1
摘要:Allocator(概念)是对访问、寻址、分配、释放、构造和析构策略的封装。是一个满足特定要求的类。标准库中需要分配释放存储空间的容器都需要一个Allocator,除了std::array。 必选成员 Allocator 需要满足的条件有很多,但是大部分都是可选的,只有几个必须存在的成员。 valu 阅读全文
posted @ 2017-09-14 19:47 PointerSMQ 阅读(2113) 评论(0) 推荐(0)
浅谈std::bind的实现
摘要:bind这个东西争议很多,用起来很迷,而且不利于编译优化,很多人都推荐用lambda而非bind。简单说,bind就是通过库抽象实现了lambda里需要写进语言标准的东西,变量捕获,参数绑定,延迟求值等。但是以此带来的缺陷就是,虽然bind生成的可调用对象的结构是编译期确定的,但是它的值,尤其是被调用的函数,全部是在运行期指定的,并且可调用对象也只是一个普通的类,因此很难进行优化。除此之外,标准库... 阅读全文
posted @ 2017-07-22 12:47 PointerSMQ 阅读(1473) 评论(0) 推荐(0)
整理C++常用整数运算的所有细节
摘要:前段时间写我的安全整数类checked,顺便就通读了标准中关于整数运算的部分,还发现了不少坑,以及自己没有了解的细节,这里就总结一下。要注意的是,C和C++在这部分的逻辑不相同 第一步,单操作数的类型提升(integral promotion) 对于C++中的所有字符类型,char,signed c 阅读全文
posted @ 2017-05-06 16:38 PointerSMQ 阅读(435) 评论(0) 推荐(0)
TinyCMips - 1 C语言子集到Mips子集编译器项目开坑
摘要:TinyCMips是我最近在写的一个编译器,就像标题所说,是一个C语言子集到Mips子集的编译器,开这个坑的目的大概是这样的 就是为了写一个完整的编译器 准备大三编译原理课拿来复用 大二他们上计组课的可以拿来将C代码编译到课程用的Mips CPU 满足个人兴趣 充实简历 之所以选择C语言并且是子集,首先是因为C标准十分庞大,其次是因为这个编译器是尝试给大二他们用... 阅读全文
posted @ 2017-01-26 22:23 PointerSMQ 阅读(637) 评论(0) 推荐(0)
C++坑点集合 - 2 严格的Multipass Guarantee
摘要:之前写了一个char32_iterator,简单说就是封装一个string::const_iterator,在operator*的时候将它引用的utf-8序列转为utf-32编码的单个字符返回——这看上去很简单。平时各位在编程的过程中一定会遇到类似的需求:实现一个惰性的transform,在一个容器的每一个元素上应用一个转换函数,但不是立即应用,而是等到使用它的时候即时转换。这听起来就像C#的Li... 阅读全文
posted @ 2017-01-24 23:50 PointerSMQ 阅读(366) 评论(0) 推荐(0)
独自handle一个数据库大程有感
摘要:这学期数据库课程,最后的大程是写一个MiniSQL的数据库实现,要求很简单,建删表,建删单值索引,支持主键和unique定义,支持最简单的select,只要支持3个类型:int,float,char(0~255)。最开始,考虑到数据库的运行时确定类型的特点,选择了运行时强大的C#,还能顺便集成进Linq。但是一周后发现C#操作对象二进制结构的能力几乎为0,在写BufferManager的时候也发现... 阅读全文
posted @ 2016-07-07 22:58 PointerSMQ 阅读(501) 评论(0) 推荐(0)
源码阅读笔记 - 3 std::string 与 Short String Optimization
摘要:众所周知,大部分情况下,操作一个自动(栈)变量的速度是比操作一个堆上的值的速度快的。然而,栈数组的大小是在编译时确定的(不要说 C99 的VLA,那货的 sizeof 是运行时计算的),但是堆数组的大小在运行时确定,很自由。此外,栈空间比堆空间有限,前者只有几MB,而后者基本上就是你系统内存的大小。 阅读全文
posted @ 2016-04-30 21:57 PointerSMQ 阅读(1355) 评论(2) 推荐(0)
源码阅读笔记 - 2 std::vector (2) 关于Allocator Aware Container特性
摘要:所有的STL容器,都保存一个或默认,或由用户提供的allocator的实例,用来提供对象内存分配和构造的方法(除了std::array),这样的容器,被称作Allocator Aware Container。早期的STL,设计的尚不完善,各种实现之间不能相互兼容,这一点在侯捷的《STL源码剖析》中有 阅读全文
posted @ 2016-03-06 14:40 PointerSMQ 阅读(949) 评论(0) 推荐(0)
源码阅读笔记 - 2 std::vector (1)
摘要:vector的源码真是太长了,今天用了一个下午和一个晚上看和注释了前面的一千行左右 p.s.博客园的代码高亮真是太垃圾, 如果想要阅读带注释的源码,推荐粘贴到VS2015里,然后按ctrl+z取消自动格式化,用我格式化好的样子,并在最前面#include <vector>和using namespa 阅读全文
posted @ 2016-03-05 22:14 PointerSMQ 阅读(1119) 评论(0) 推荐(0)

1 2 下一页